C++ opengl 2d游戏只绘制第二个精灵纹理,而不是第一个
我目前正在使用OpenGL创建一个2d格斗游戏,我遇到了一个问题,OpenGL只在我上次初始化的精灵位置绘制,而不管我初始化并尝试绘制多少精灵。即使在初始化C++ opengl 2d游戏只绘制第二个精灵纹理,而不是第一个,c++,opengl,graphics2d,C++,Opengl,Graphics2d,我目前正在使用OpenGL创建一个2d格斗游戏,我遇到了一个问题,OpenGL只在我上次初始化的精灵位置绘制,而不管我初始化并尝试绘制多少精灵。即使在初始化sprite1和sprite2但仅绘制sprite1时,sprite仍将被绘制。它从我的sprite类开始,在该类中我初始化屏幕上我想要图像的位置以及要使用的图像: 雪碧 Init(int screenCoordinateX, int screenCoordinateY, uint imageWidth, unsigned int imag
sprite1
和sprite2
但仅绘制sprite1
时,sprite
仍将被绘制。它从我的sprite类开始,在该类中我初始化屏幕上我想要图像的位置以及要使用的图像:
雪碧
Init(int screenCoordinateX, int screenCoordinateY, uint imageWidth, unsigned int imageHeight, std::string imageFilePath)
{
//casting to float since GLSL shader variables vec2,3,4 require vertex data to be in floats
this->x = static_cast<float>(x);
this->y = static_cast<float>(y);
this->width = static_cast<float>(width);
this->height = static_cast<float>(height);
glGenBuffers(1, &vboID);
Blz::Graphics::GLTexture texture(imageFilePath);
this->texture = texture;
float halfWidth = this->width / 2;
//Setting sprite origin at bottom middle of image by subtracting half width
this->vertexData.at(0).SetPosition(glm::vec3{ this->x + (this->width - halfWidth), this->y + this->height, 0.0f });//Top right corner
this->vertexData.at(1).SetPosition(glm::vec3{ this->x - halfWidth, this->y + height, 0.0f });//Top left corner
this->vertexData.at(2).SetPosition(glm::vec3{ this->x - halfWidth, this->y, 0.0f });//Bottom left corner
this->vertexData.at(3).SetPosition(glm::vec3{ this->x - halfWidth, this->y, 0.0f });//Bottom left corner
this->vertexData.at(4).SetPosition(glm::vec3{ this->x + (this->width - halfWidth), this->y, 0.0f });//Bottom right corner
this->vertexData.at(5).SetPosition(glm::vec3{ this->x + (this->width - halfWidth), this->y + this->height, 0.0f });//Top right corner
this->vertexData.at(0).SetUV(glm::vec2{ 1.0f, 1.0f });
this->vertexData.at(1).SetUV(glm::vec2{ 0.0f, 1.0f });
this->vertexData.at(2).SetUV(glm::vec2{ 0.0f, 0.0f });
this->vertexData.at(3).SetUV(glm::vec2{ 0.0f, 0.0f });
this->vertexData.at(4).SetUV(glm::vec2{ 1.0f, 0.0f });
this->vertexData.at(5).SetUV(glm::vec2{ 1.0f, 1.0f });
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, (sizeof(Vector3D) * this->vertexData.size()), &this->vertexData.front(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vector3D), (void*)offsetof(Vector3D, position));
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vector3D), (void*)offsetof(Vector3D, textureCoordinates));
//Unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
因此,即使我要求绘制sprite1
,只有sprite2
在100x100y的位置会被绘制到屏幕上。即使我手动尝试在renderer.cpp中输入1的vboID
(即sprite1
的vboID
),它仍然会绘制sprite2
的位置。我做错了什么
以下是我的着色器(如果需要):
VertexShader.glsl
#version 430
in vec3 vertexPosition;
in vec2 textCoord;
out vec2 TextureCoord;
uniform mat4 transformationMatrix;
void main()
{
vec4 position = vec4(vertexPosition, 1.0f);
gl_Position = transformationMatrix * position;
TextureCoord = textCoord;
};
#version 430
out vec4 daColor;
in vec2 TextureCoord;
uniform sampler2D basicTexture;
void main()
{
vec4 texel = texture(basicTexture, TextureCoord);
daColor = texel;
};
FragmentShader.glsl
#version 430
in vec3 vertexPosition;
in vec2 textCoord;
out vec2 TextureCoord;
uniform mat4 transformationMatrix;
void main()
{
vec4 position = vec4(vertexPosition, 1.0f);
gl_Position = transformationMatrix * position;
TextureCoord = textCoord;
};
#version 430
out vec4 daColor;
in vec2 TextureCoord;
uniform sampler2D basicTexture;
void main()
{
vec4 texel = texture(basicTexture, TextureCoord);
daColor = texel;
};
所以我想这是一个教训,任何有志于学习和使用OpenGL的人。在使用vbo和vbo ID将OpenGL缓冲区绑定到的任何时候,在绘制之前还需要再次指定VertexAttribute指针。因此,我的新renderer.cpp文件如下所示:
void Renderer::Draw(Sprite& sprite)
{
glm::mat4 orthoProjection = glm::ortho(0.0f, static_cast<sfloat>(1024), 0.0f, static_cast<sfloat>(768));
GLuint transformationMatrixUniformLocation = this->shaderProgram.GetUniformLocation("transformationMatrix");
glUniformMatrix4fv(transformationMatrixUniformLocation, 1, GL_FALSE, &(orthoProjection[0][0]));
glBindTexture(GL_TEXTURE_2D, sprite.texture.id);
glBindBuffer(GL_ARRAY_BUFFER, sprite.vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vector3D), (void*)offsetof(Vector3D, position));
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vector3D), (void*)offsetof(Vector3D, textureCoordinates));
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void渲染器::绘制(精灵和精灵)
{
glm::mat4正射=glm::正射(0.0f,静态投影(1024),0.0f,静态投影(768));
GLuint transformationMatrixUniformLocation=此->着色器程序.GetUniformLocation(“transformationMatrix”);
glUniformMatrix4fv(转换矩阵uniformLocation,1,GL_FALSE,&(正投影[0][0]);
glBindTexture(GL_TEXTURE_2D,sprite.TEXTURE.id);
glBindBuffer(GL_数组_BUFFER,sprite.vboID);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,sizeof(Vector3D),(void*)偏移(Vector3D,position));
glvertexattributepointer(1,2,GL_FLOAT,GL_FALSE,sizeof(Vector3D),(void*)偏移(Vector3D,textureCoordinates));
gldrawArray(GL_三角形,0,6);
glBindBuffer(GL_数组_BUFFER,0);
}
另一个答案给出了原因:。为了避免这种情况,您可以使用更新的VAO来存储顶点属性信息,这样就不必每次都指定VertexAttributePointer函数 请澄清您使用的是OpenGL还是OpenGL ES,并相应地编辑标记。@Reaper对不起,我取下了OpenGL ES。它是openGL@Rabbid76哦,对不起。我知道我会忘记发东西。它是在我的Renderer::Init()函数中设置的,该函数名为prior
GLuint uniformLocation=this->shaderProgram.GetUniformLocation(“basicTexture”)编码>并设置glUniform1i(uniformLocation,0)
@rabbi76,我使用的是一个向量3D而不是2D,因为我不确定以后是否需要z值来进行某种排序技术(这是我第一次尝试这样一种边学边玩的游戏)。@rabbi76是的。它似乎只绘制指定的最后一个精灵纹理