纹理映射金字塔
Texture Mapping a Pyramid
我正在尝试为我绘制的金字塔添加纹理。我正在尝试绘制一个砖块纹理,该纹理在所有侧面都具有相同的方向,但是到目前为止我尝试过的所有纹理坐标都使我在金字塔的某些面上具有正确的方向,而在其他侧面则具有翻转的方向。所附图片显示了我所指的内容,我试图让金字塔的所有面都具有如图所示的“正确”方向
我认为这是我的纹理坐标的问题。
这是我正在使用的顶点和纹理坐标:
GLfloat verts[] = {
// Vertex Positions // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // Top Right Vertex
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // Bottom Right Vertex
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // Bottom Left Vertex
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // Top Left Vertex
0.0f, 0.0f, 1.0f, 0.5f, 0.5f// Pyramid top vertex
};
您可能必须为每个顶点使用多个纹理坐标。底座的纹理坐标为:
float basetexcoords[] = {
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f
};
每边的纹理坐标为:
float sidetexcoords[] = {
0.5f, 0.5f,
1.0f, 0.0f,
0.0f, 0.0f
};
一种可行的方法是在 verts
数组中重复相同的顶点位置。虽然不是很节省内存而且相当糟糕,但它是一个简单的解决方案。
这是它的样子:
float verts[] = {
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
};
我正在尝试为我绘制的金字塔添加纹理。我正在尝试绘制一个砖块纹理,该纹理在所有侧面都具有相同的方向,但是到目前为止我尝试过的所有纹理坐标都使我在金字塔的某些面上具有正确的方向,而在其他侧面则具有翻转的方向。所附图片显示了我所指的内容,我试图让金字塔的所有面都具有如图所示的“正确”方向
我认为这是我的纹理坐标的问题。
这是我正在使用的顶点和纹理坐标:
GLfloat verts[] = {
// Vertex Positions // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // Top Right Vertex
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // Bottom Right Vertex
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // Bottom Left Vertex
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // Top Left Vertex
0.0f, 0.0f, 1.0f, 0.5f, 0.5f// Pyramid top vertex
};
您可能必须为每个顶点使用多个纹理坐标。底座的纹理坐标为:
float basetexcoords[] = {
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f
};
每边的纹理坐标为:
float sidetexcoords[] = {
0.5f, 0.5f,
1.0f, 0.0f,
0.0f, 0.0f
};
一种可行的方法是在 verts
数组中重复相同的顶点位置。虽然不是很节省内存而且相当糟糕,但它是一个简单的解决方案。
这是它的样子:
float verts[] = {
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
};