构造一个OpenGL立方体 [英] Texturing an opengl cube
问题描述
我有一个opengl立方体,我想对所有6个面进行纹理处理.
I have an opengl cube and I want to texture all 6 faces.
我需要多个纹理吗?
这是当前多维数据集的屏幕截图:
Here's a screenshot of the current cube:
基本上我不知道如何在整个立方体上包裹纹理...
basically I don't know how to wrap the texture around the entire cube...
这是我的cube.h标头文件,其中定义了IBO和VBO
here's my cube.h header file where the IBO's and VBO's are defined
#pragma once
#include <GL\glew.h>
class cube {
public:
cube() {
x = 0;
y = 0;
z = 0;
width = 0;
vertices = 0;
indices = 0;
}
cube(GLfloat X, GLfloat Y, GLfloat Z, float w) {
x = X;
y = Y;
z = Z;
width = w;
vertices = new GLfloat[40];
//1
vertices[0] = x; //x pos
vertices[1] = y; //y pos
vertices[2] = z; //z pos
vertices[3] = 0; //x pos in texture
vertices[4] = 1; //y pos in texture
//2
vertices[5] = x + width;
vertices[6] = y;
vertices[7] = z;
vertices[8] = 1;
vertices[9] = 1;
//3
vertices[10] = x;
vertices[11] = y - width;
vertices[12] = z;
vertices[13] = 0;
vertices[14] = 0;
//4
vertices[15] = x + width;
vertices[16] = y - width;
vertices[17] = z;
vertices[18] = 1;
vertices[19] = 0;
//5
vertices[20] = x;
vertices[21] = y;
vertices[22] = z - width;
vertices[23] = 0;
vertices[24] = 1;
//6
vertices[25] = x + width;
vertices[26] = y;
vertices[27] = z - width;
vertices[28] = 1;
vertices[29] = 1;
//7
vertices[30] = x;
vertices[31] = y - width;
vertices[32] = z - width;
vertices[33] = 0;
vertices[34] = 0;
//8
vertices[35] = x + width;
vertices[36] = y - width;
vertices[37] = z - width;
vertices[38] = 1;
vertices[39] = 0;
//indices
indices = new unsigned int[36];
//0
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
//1
indices[3] = 1;
indices[4] = 2;
indices[5] = 3;
//2
indices[6] = 4;
indices[7] = 5;
indices[8] = 6;
//3
indices[9] = 5;
indices[10] = 6;
indices[11] = 7;
//4
indices[12] = 4;
indices[13] = 0;
indices[14] = 1;
//5
indices[15] = 4;
indices[16] = 5;
indices[17] = 1;
//6
indices[18] = 6;
indices[19] = 2;
indices[20] = 3;
//7
indices[21] = 6;
indices[22] = 7;
indices[23] = 3;
//8
indices[24] = 1;
indices[25] = 5;
indices[26] = 3;
//9
indices[27] = 5;
indices[28] = 7;
indices[29] = 3;
//10
indices[30] = 4;
indices[31] = 0;
indices[32] = 2;
//11
indices[33] = 4;
indices[34] = 6;
indices[35] = 2;
}
GLfloat* vertices;
unsigned int* indices;
private:
GLfloat x;
GLfloat y;
GLfloat z;
float width;
};
此代码所做的全部工作是为多维数据集对象设置一个简单的VBO和IBO/EBO,以便以后使用.
all this code does is set up a simple VBO and IBO/EBO for a cube object to later be used.
推荐答案
问题是每个多维数据集顶点在3个面中共享,这些3个面的纹理坐标可能不同.因此,您可以复制此类顶点(每个顶点具有不同的纹理坐标),或使用2个单独的索引(一个用于顶点,一个用于纹理).
the problem is that each cube vertex is shared among 3 faces in which its texture coordinate might not be the same. So you either duplicate such vertexes (each with different texture coordinate) or use 2 separate indices (one for vertex and one for texture).
重复可能看起来像这样(使用 GL_QUADS
原语):
The duplication might look like this (using GL_QUADS
primitive):
double cube[]=
{
// x, y, z, s, t,
+1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,-1.0,1.0,1.0,
-1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,-1.0,0.0,0.0,
-1.0,+1.0,-1.0,0.0,0.0,
-1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,+1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,
-1.0,-1.0,+1.0,0.0,1.0,
+1.0,-1.0,+1.0,1.0,1.0,
+1.0,+1.0,+1.0,1.0,0.0,
-1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,-1.0,1.0,1.0,
+1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,+1.0,0.0,1.0,
+1.0,+1.0,-1.0,0.0,1.0,
-1.0,+1.0,-1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,+1.0,0.0,0.0,
-1.0,-1.0,+1.0,1.0,0.0,
-1.0,-1.0,-1.0,1.0,1.0,
+1.0,-1.0,-1.0,0.0,1.0,
};
具有这种纹理:
这(对于旧的GL API很有用,但更易于测试):
And this (sory for old GL api but its easier to test with):
int i,n=sizeof(cube)/(sizeof(cube[0]));
glColor3f(1.0,1.0,1.0);
scr.txrs.bind(txr);
glBegin(GL_QUADS);
for (i=0;i<n;i+=5)
{
glTexCoord2dv(cube+i+3);
glVertex3dv(cube+i+0);
}
glEnd();
scr.txrs.unbind();
我得到了这个结果:
这篇关于构造一个OpenGL立方体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!