C++ OpenGL 3.3纹理映射3D对象

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,

我正在尝试用两种不同的纹理对3D台球桌进行纹理处理,一种用于桌面,另一种用于腿部和墙壁。桌面基本上是一个2D矩形,我在上面应用了一些绿色纹理,一切都很好。另一方面,当我尝试对构成表格的立方体进行纹理处理时,我遇到了一些采样或映射问题。
这是我的代码:
创建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数组,而不是设置顶点数组的代码?我们该如何判断你是否正确地喂入顶点阶段?