我一直很喜欢和OpenGl一起玩,并且已经关注了一些例子
我的问题是纹理化多维数据集。大多数侧面纹理很好(正面,背面,左侧),但右边是一团糟。
我的立方体
// cube
static const GLfloat cubeVertices[] = {
-5.0f, 15.0f, 5.0f,
5.0f, 15.0f, 5.0f,
5.0f,0.0f, 5.0f,
-5.0f,0.0f, 5.0f,
-5.0f, 15.0f,-5.0f,
5.0f, 15.0f,-5.0f,
5.0f,0.0f,-5.0f,
-5.0f,0.0f,-5.0f
};
static const GLubyte cubeNumberOfIndices = 36;
const GLubyte cubeVertexFaces[] = {
0, 1, 5, // Half of top face
0, 5, 4, // Other half of top face
4, 6, 5, // Half of front face
4, 6, 7, // Other half of front face
0, 1, 2, // Half of back face
0, 3, 2, // Other half of back face
1, 2, 5, // Half of right face
2, 5, 6, // Other half of right face
0, 3, 4, // Half of left face
7, 4, 3, // Other half of left face
3, 6, 2, // Half of bottom face
6, 7, 3, // Other half of bottom face
};
我的纹理贴图
const GLshort squareTextureCoords2[] = {
0, 5, // top left
0, 0, // bottom left
15, 0, //bottom right
15, 5 //top right
};
我的立方体代码
//tell GL about our texture
glBindTexture(GL_TEXTURE_2D, 1);
glTexCoordPointer(2, GL_SHORT, 0, squareTextureCoords2);
glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
for(int i = 0; i < cubeNumberOfIndices; i += 3) {
//glColor4ub(cubeFaceColors[colorIndex], cubeFaceColors[colorIndex+1], cubeFaceColors[colorIndex+2], cubeFaceColors[colorIndex+3]);
int face = (i / 3.0);
if (face % 2 != 0.0) {
}
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, &cubeVertexFaces[i]);
}
正如我所说的,一切都呈现出来但是立方体的一面(不能看到顶部和底部所以不用担心)纹理变得奇怪
由于
更新**
我现在尝试了这些Coords,并且纹理没有出现在每一面上,它从前到后纹理化,因此边缘就像纹理的另一边缘的线条。我必须接近破解这个
const GLfloat squareTextureCoords3[] = {
// Front face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Top face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Rear face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Bottom face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Left face
5, 5, // top left
0, 5, // bottom left
0, 0, // bottom right
5, 0, // top right
// Right face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
};
答案 0 :(得分:3)
首先,要描述八个顶点,您需要八个纹理坐标。你提供的缓冲区只包含四个,所以行为在技术上是未定义的(并且可能取决于你的编译器在数组后放入内存中的内容)。
将一个常量作为纹理名称传递给glBindTexture也没有用。你应该传递glGenTextures早先给你的任何东西。
即使这些问题得到解决,当你想到它时,如果你刚刚坚持只有八个顶点,那么边缘面上的纹理坐标将不会非常有用吗?这意味着您必须找到每个顶点的纹理坐标,这些坐标对每个连接的面都有意义。尝试在纸上画出来 - 我不确定它是否可行。为避免这种情况,您需要提供具有不同纹理坐标的重复顶点位置。
编辑:立方体的示例几何图形,其中每个面都有一组完全唯一的顶点(直接在此处键入,未经测试,以确定点):
// this is unchanged from your original
static const GLfloat squareTextureCoords3[] = {
// Front face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Top face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Rear face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Bottom face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
// Left face
5, 5, // top left
0, 5, // bottom left
0, 0, // bottom right
5, 0, // top right
// Right face
0, 5, // top left
0, 0, // bottom left
5, 0, // bottom right
5, 5, // top right
};
// this is changed, to match the tex coord list
static const GLfloat cubeVertices[] = {
// front face
-5.0f, 15.0f, 5.0f,
5.0f, 15.0f, 5.0f,
5.0f, 0.0f, 5.0f,
-5.0f, 0.0f, 5.0f,
// top face
-5.0f, 15.0f, 5.0f,
5.0f, 15.0f, 5.0f,
5.0f, 15.0f,-5.0f,
-5.0f, 15.0f,-5.0f,
// rear face
-5.0f, 15.0f,-5.0f,
5.0f, 15.0f,-5.0f,
5.0f,0.0f,-5.0f,
-5.0f,0.0f,-5.0f
// bottom face
-5.0f, 0.0f, 5.0f,
5.0f, 0.0f, 5.0f,
5.0f, 0.0f,-5.0f,
-5.0f, 0.0f,-5.0f,
// left face
-5.0f, 0.0f, 5.0f,
-5.0f, 0.0f,-5.0f,
-5.0f, 15.0f,-5.0f,
-5.0f, 15.0f, 5.0f,
// right face
5.0f, 0.0f, 5.0f,
5.0f, 0.0f,-5.0f,
5.0f, 15.0f,-5.0f,
5.0f, 15.0f, 5.0f,
};
// this is changed also, to match the new arrays above
const GLubyte cubeVertexFaces[] = {
4, 5, 6, // Half of top face
4, 6, 7, // Other half of top face
0, 1, 2, // Half of front face
0, 2, 3, // Other half of front face
8, 9, 10, // Half of back face
8, 10, 11, // Other half of back face
20, 21, 22, // Half of right face
20, 22, 23, // Other half of right face
16, 17, 18, // Half of left face
16, 18, 19, // Other half of left face
12, 13, 14, // Half of bottom face
12, 14, 15, // Other half of bottom face
};
其他代码保持不变。关键是在OpenGL中你不能单独索引顶点位置和纹理坐标。忽略颜色,法线等的可能性,OpenGL中顶点的描述是一个具有一个纹理坐标的位置。
答案 1 :(得分:0)
尝试
const GLubyte cubeVertexFaces[] = {
...
1, 5, 2, // Half of right face
6, 2, 5, // Other half of right face
...
};