C++ 具有固定glBufferData Vert(GLFW)的可变图像大小

C++ 具有固定glBufferData Vert(GLFW)的可变图像大小,c++,opengl,glfw,C++,Opengl,Glfw,我从游戏开发开始,为了掌握诀窍,我想使用GLFW将是一个很好的开始。我遵循了一个基本的教程,并有一些基本功能的简单游戏 我的问题在教程中,当设置OpenGL窗口时,它对glBufferData使用固定的顶点: 据我所知,这是正确的做法,这是有道理的,但加载的所有纹理都符合此大小。因此,即使图像具有不同的分辨率,它们仍然会拉伸到该垂直的规格 编辑2: glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);

我从游戏开发开始,为了掌握诀窍,我想使用GLFW将是一个很好的开始。我遵循了一个基本的教程,并有一些基本功能的简单游戏

我的问题在教程中,当设置OpenGL窗口时,它对
glBufferData
使用固定的顶点:




据我所知,这是正确的做法,这是有道理的,但加载的所有纹理都符合此大小。因此,即使图像具有不同的分辨率,它们仍然会拉伸到该垂直的规格


编辑2:

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0);   
glEnd();

你的纹理以什么方式被扭曲?在本例中,它们被映射为在四边形上精确拉伸1次。如果要根据精灵图像尺寸更改四边形的大小,则应相应缩放几何体。@AndonM.Coleman刚被放大到
顶点的大小。所以,最好创建一个具有精灵维度的成员变量,并使用它进行渲染?另外,如果glDrawArray最终负责渲染,我是否应该使用类似于第二次编辑中的代码?从功能上讲,编辑2中的代码可以做到这一点。但在实践中,不要在遥远的将来使用立即模式(
glBegin(…)
/
glEnd(…)
):),如果使用顶点着色器,可以避免所有这些。在着色器中,可以测试(
纹理化(…)
说明)或传递纹理的尺寸,并在渲染时修改顶点位置,而不是修改顶点缓冲区。
void GameWindow::setupGL() {
    glClearColor(0.05f, 0.05f, 0.05f, 1.0f);
    glViewport(0, 0, _width, _height);

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_DEPTH_TEST);

    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0, _width, 0, _height);
    glMatrixMode(GL_MODELVIEW);

    glGenBuffers(1, &_vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(VertexData), (GLvoid *) offsetof(VertexData, positionCoordinates));

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(VertexData), (GLvoid *) offsetof(VertexData, textureCoordiantes));

}
GLuint GameWindow::loadAndBufferImage(const char *filename) {
    GLFWimage imageData;
    glfwReadImage(filename, &imageData, NULL);

    GLuint textureBufferID;
    glGenTextures(1, &textureBufferID);
    glBindTexture(GL_TEXTURE_2D, textureBufferID);
    std::cout << "Width:" << imageData.Width << " Height:" << imageData.Height << std::endl;
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageData.Width, imageData.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData.Data);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glfwFreeImage(&imageData);

    return textureBufferID;
}
void Sprite::render() {
    glBindTexture(GL_TEXTURE_2D, _textureBufferID);

    glLoadIdentity();

    glTranslatef(_position.x, _position.y, 0);
    glRotatef(_rotation, 0, 0, 1.0f);

    glDrawArrays(GL_QUADS, 0, 4);
}
glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0);   
glEnd();