如何在 OpenGL (2.1) 中将纹理添加到顶点缓冲区对象
How to add textures to vertex buffer objects in OpenGL (2.1)
在 OpenGL 2.1 中纹理映射对象的正确方法是什么?目前我正在执行以下步骤,但无法使纹理正确显示在对象上。
- 生成缓冲区并存储 ID
- 绑定缓冲区
- 上传数据到缓冲区
每次渲染缓冲区中的对象时:
4.1。启用 GL_TEXTURE_2D
、GL_VERTEX_ARRAY
和 GL_TEXTURE_COORD_ARRAY
4.2。绑定纹理然后绑定缓冲区
4.3 设置 glTexCoordPointer
然后设置 glVertexPointer
4.4 使用glDrawArrays
渲染物体
4.5调用glFlush
创建 VBO 的代码:
GLuint flagVBO;
glGenBuffers(1, &flagVBO);
glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(flag), (void*) flag, GL_STATIC_DRAW);
渲染 VBO 的代码:
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, gameManager->getTextureManager().getTexture("poleEndFlag")); //The get texture method returns 2 which is the correct texture
glColor3f(1.0, 1.0, 1.0);
glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*)3);
glVertexPointer(3, GL_FLOAT, sizeof(float)*5, (GLvoid*)0);
glDrawArrays(GL_QUADS, 0, sizeof(flag) / sizeof(float) / 5);
glFlush();
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
标记VBO数组:
flag[120] = {
//Bottom
-0.1, 1.4, 0.025, 1, 1,
-0.8, 1.4, 0.025, 0, 1,
-0.8, 1.4, -0.025, 0, 0,
-0.1, 1.4, -0.025, 1, 0,
//Top
-0.1, 1.95, 0.025, 1, 1,
-0.8, 1.95, 0.025, 0, 1,
-0.8, 1.95, -0.025, 0, 0,
-0.1, 1.95, -0.025, 1, 0,
//Front
-0.1, 1.4, 0.025, 1, 0,
-0.8, 1.4, 0.025, 0, 0,
-0.8, 1.95, 0.025, 0, 1,
-0.1, 1.95, 0.025, 1, 1,
//Back
-0.1, 1.4, -0.025, 1, 0,
-0.8, 1.4, -0.025, 0, 0,
-0.8, 1.95, -0.025, 0, 1,
-0.1, 1.95, -0.025, 1, 1,
//Left
-0.8, 1.95, 0.025, 1, 1,
-0.8, 1.4, 0.025, 0, 1,
-0.8, 1.4, -0.025, 0, 0,
-0.8, 1.95, -0.025, 1, 0,
//Right
-0.1, 1.95, 0.025, 1, 1,
-0.1, 1.4, 0.025, 0, 1,
-0.1, 1.4, -0.025, 0, 0,
-0.1, 1.95, -0.025, 1, 0
}
似乎顶点坐标渲染正确,但 tex 坐标渲染不正确。对象呈现为与纹理中的主要颜色相同的颜色,但整个纹理不存在。
图片左边是渲染后的对象,右边是它应该有的纹理
你的纹理坐标指针是错误的。偏移量以 字节 为单位。您指定的 3 个字节位于顶点位置的 x 和 y 坐标之间。正确的值为
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*) (3*sizeof(GLfloat)) );
在 OpenGL 2.1 中纹理映射对象的正确方法是什么?目前我正在执行以下步骤,但无法使纹理正确显示在对象上。
- 生成缓冲区并存储 ID
- 绑定缓冲区
- 上传数据到缓冲区
每次渲染缓冲区中的对象时:
4.1。启用
GL_TEXTURE_2D
、GL_VERTEX_ARRAY
和GL_TEXTURE_COORD_ARRAY
4.2。绑定纹理然后绑定缓冲区
4.3 设置
glTexCoordPointer
然后设置glVertexPointer
4.4 使用
glDrawArrays
渲染物体4.5调用
glFlush
创建 VBO 的代码:
GLuint flagVBO;
glGenBuffers(1, &flagVBO);
glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(flag), (void*) flag, GL_STATIC_DRAW);
渲染 VBO 的代码:
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, gameManager->getTextureManager().getTexture("poleEndFlag")); //The get texture method returns 2 which is the correct texture
glColor3f(1.0, 1.0, 1.0);
glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*)3);
glVertexPointer(3, GL_FLOAT, sizeof(float)*5, (GLvoid*)0);
glDrawArrays(GL_QUADS, 0, sizeof(flag) / sizeof(float) / 5);
glFlush();
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
标记VBO数组:
flag[120] = {
//Bottom
-0.1, 1.4, 0.025, 1, 1,
-0.8, 1.4, 0.025, 0, 1,
-0.8, 1.4, -0.025, 0, 0,
-0.1, 1.4, -0.025, 1, 0,
//Top
-0.1, 1.95, 0.025, 1, 1,
-0.8, 1.95, 0.025, 0, 1,
-0.8, 1.95, -0.025, 0, 0,
-0.1, 1.95, -0.025, 1, 0,
//Front
-0.1, 1.4, 0.025, 1, 0,
-0.8, 1.4, 0.025, 0, 0,
-0.8, 1.95, 0.025, 0, 1,
-0.1, 1.95, 0.025, 1, 1,
//Back
-0.1, 1.4, -0.025, 1, 0,
-0.8, 1.4, -0.025, 0, 0,
-0.8, 1.95, -0.025, 0, 1,
-0.1, 1.95, -0.025, 1, 1,
//Left
-0.8, 1.95, 0.025, 1, 1,
-0.8, 1.4, 0.025, 0, 1,
-0.8, 1.4, -0.025, 0, 0,
-0.8, 1.95, -0.025, 1, 0,
//Right
-0.1, 1.95, 0.025, 1, 1,
-0.1, 1.4, 0.025, 0, 1,
-0.1, 1.4, -0.025, 0, 0,
-0.1, 1.95, -0.025, 1, 0
}
似乎顶点坐标渲染正确,但 tex 坐标渲染不正确。对象呈现为与纹理中的主要颜色相同的颜色,但整个纹理不存在。
图片左边是渲染后的对象,右边是它应该有的纹理
你的纹理坐标指针是错误的。偏移量以 字节 为单位。您指定的 3 个字节位于顶点位置的 x 和 y 坐标之间。正确的值为
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*) (3*sizeof(GLfloat)) );