C++ OpenGL 3.3纹理映射3D对象
我正在尝试用两种不同的纹理对3D台球桌进行纹理处理,一种用于桌面,另一种用于腿部和墙壁。桌面基本上是一个2D矩形,我在上面应用了一些绿色纹理,一切都很好。另一方面,当我尝试对构成表格的立方体进行纹理处理时,我遇到了一些采样或映射问题。C++ OpenGL 3.3纹理映射3D对象,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,我正在尝试用两种不同的纹理对3D台球桌进行纹理处理,一种用于桌面,另一种用于腿部和墙壁。桌面基本上是一个2D矩形,我在上面应用了一些绿色纹理,一切都很好。另一方面,当我尝试对构成表格的立方体进行纹理处理时,我遇到了一些采样或映射问题。 这是我的代码: 创建VAO和地图 // Cube vertex data float cubeVertices[ CUBE_NUM_VERTICES * VALS_PER_VERT ] = { -1.0, -1.0, 1.0, 1.0, -1.0,
这是我的代码:
创建VAO和地图
// Cube vertex data
float cubeVertices[ CUBE_NUM_VERTICES * VALS_PER_VERT ] = {
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0,
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
1.0, 1.0, -1.0,
-1.0, 1.0, -1.0 };
// 12 triangles - 2 per face of the cube
unsigned int legWallIndices[CUBE_NUM_TRIS*3] = {
0,1,2, 2,3,0,
1,5,6, 6,2,1,
5,4,7, 7,6,5,
4,0,3, 3,7,4,
3,2,6, 6,7,3,
4,5,1, 1,0,4
};
float tableTopVertices[4 * VALS_PER_VERT] = {
-2.5f, 0.26f, -5.0f,
2.5f, 0.26f, -5.0f,
2.5f, 0.26f, 5.0f,
-2.5f, 0.26f, 5.0f,
};
unsigned int tableTopIndices[2*3] = {
0,1,2, 2,3,0,
};
float tabletTopTexCoord[4 * VALS_PER_TEX] = {
0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f
};
float legWallTexCoord[8 * VALS_PER_TEX] = {
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
// not working properly idk why
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
};
顶点着色器
in vec2 green_tex_coord;
in vec2 wood_tex_coord;
out vec2 st1;
out vec2 st2;
void main(void)
{
st1 = green_tex_coord;
st2 = wood_tex_coord;
}
片段着色器
in vec2 st1;
in vec2 st2;
uniform sampler2D greenTexMap;
uniform sampler2D woodTexMap;
void main(void)
{
vec4 topClr = vec4(0.04, 0.42, 0.1, 1.0);
vec4 sideClr = vec4(0.5, 0.35, 0.05, 1.0);
if (predicate){
fragColour = topClr * texture(greenTexMap, st1);
}else{
fragColour = sideClr * texture(woodTexMap, st2);
}
}
这就是结果(绿色纹理有效,但木质纹理无效)
如果我删除*纹理(woodTexMap,st2)
颜色会发生变化(它显示sideClr),这意味着纹理到达片段,但它的采样或映射不正确。如果我删除sideClr*
,颜色会再次改变,显示的是普通颜色而不是纹理(实际上它看起来像是对图片左下角进行了采样)
我是以错误的方式映射它还是采样问题?您的顶点着色器看起来不可信。例如,在哪里执行透视变换?为了清晰起见,我删除了所有与此问题不严格相关的内容,因为其他一切都很好,您只能使用一个采样器和更简单的着色器。使用与桌面相同的设置绘制腿部网格,只需切换VB、IB和纹理/采样器哦,是的,我猜是这样的,但我想让它尽可能简单,因为这是我第一次尝试使用纹理。我要试一试。无论如何,我认为这与问题无关,是吗?嗯,为什么你要发布数据,即客户端C数组,而不是设置顶点数组的代码?我们该如何判断您是否正确地为顶点阶段馈电?您的顶点着色器看起来不可信。例如,在哪里执行透视变换?为了清晰起见,我删除了所有与此问题不严格相关的内容,因为其他一切都很好,您只能使用一个采样器和更简单的着色器。使用与桌面相同的设置绘制腿部网格,只需切换VB、IB和纹理/采样器哦,是的,我猜是这样的,但我想让它尽可能简单,因为这是我第一次尝试使用纹理。我要试一试。无论如何,我认为这与问题无关,是吗?嗯,为什么你要发布数据,即客户端C数组,而不是设置顶点数组的代码?我们该如何判断你是否正确地喂入顶点阶段?