C++ opengl 2d游戏只绘制第二个精灵纹理,而不是第一个

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

我目前正在使用OpenGL创建一个2d格斗游戏,我遇到了一个问题,OpenGL只在我上次初始化的精灵位置绘制,而不管我初始化并尝试绘制多少精灵。即使在初始化
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是的。它似乎只绘制指定的最后一个精灵纹理