Texturing a Quad in OpenGL
到目前为止,我已经学习了如何在OpenGL中创建带有纹理的多维数据集。
现在,我想更改此代码以纹理四边形。我已将顶点索引从多维数据集更改为四边形。
Quad看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 | GLfloat vertices[] = { 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f }; unsigned int indices[]{ 0,1,2, 1,2,3, }; |
2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for (size_t o = 0; o < 6; o++) { glPixelStorei(GL_UNPACK_ROW_LENGTH, breite_komplett); glPixelStorei(GL_UNPACK_SKIP_PIXELS, ausschnitt_x_counter); glPixelStorei(GL_UNPACK_SKIP_ROWS, ausschnitt_y_counter); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + o, 0, GL_RGBA, ausschnitt_breite, ausschnitt_h?he, 0, GL_RGBA, GL_UNSIGNED_BYTE, sprite_image.getPixelsPtr()); } 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_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glGenerateMipmap(GL_TEXTURE_CUBE_MAP); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glEnable(GL_TEXTURE_2D); |
您有什么需要改变的想法吗?
编辑:
1 2 3 4 | unsigned int indices[]{ 0,1,2, 0,2,3 }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | glGenVertexArrays(1, &obj_vao); glBindVertexArray(obj_vao); glGenBuffers(1, &obj_ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies[0])* indicies_count, indicies, GL_STATIC_DRAW); glGenBuffers(1, &obj_vbo); glBindBuffer(GL_ARRAY_BUFFER, obj_vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * count_vertices, vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertices[0]) * 5, 0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertices[0]) * 5, (void*)(sizeof(vertices[0]) * 3)); glEnableVertexAttribArray(1); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
编辑:
如果顶点是这样的:
1 2 3 4 5 6 | GLfloat vertices[] = { 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f }; |
一切都很好,Quad看起来像这样:
但是我需要像这样的原点中的四边形:
1 2 3 4 5 6 | GLfloat vertices[] = { 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f }; |
此顶点使纹理变形...
2个三角形基元的索引不形成四边形。索引必须是:
1 | unsigned int indices[]{ 0, 1, 2, 0, 2, 3 }; |
1 2 3 4 5 6 | 3 0 +-----+ + | / / | | / / | + +-----+ 2 1 |
创建纹理时,将
无论如何,如果要创建立方体贴图纹理,那么在设置参数时也必须使用
纹理立方体的纹理坐标是3维向量。更改立方体侧面的顶点坐标。例如:
(您根本不需要纹理坐标)
1 2 3 4 5 6 7 | GLfloat vertices[] = { // x y z 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f }; |
立方体的中心是(0,0,0),因此您也可以使用纹理的顶点坐标:
顶点着色器
1 2 3 4 5 6 7 8 9 10 | in vec3 position; out vec3 cubeCoord; void main() { cubeCoord = position; // [...] } |
片段着色器:
1 2 3 4 5 6 7 8 9 | in vec3 cubeCoord; uniform samplerCube cubeTex; void main() { vec4 color = texture(cubeTex, cubeCoord); // [...] } |
或者,您可以为立方体贴图纹理使用单独的3维纹理坐标:
1 2 3 4 5 6 7 | GLfloat vertices[] = { // x y z u v w 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 1.0f, }; |