OpenGL混淆了多个纹理

时间:2017-04-24 15:55:35

标签: c++ opengl textures texture-mapping

我正在使用OpenGL 3.3开发一个3D程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要用一个共同的纹理纹理所有立方体的所有面,除了一个应具有不同纹理的面。我尝试了一个单一的纹理,一切正常,但当我尝试添加另一个时,程序似乎随机行为 我的问题:
是否有一种将多个纹理传递给着色器的合适方法? 为了呈现正确的纹理,我应该如何跟踪面部? 谷歌搜索我发现两次定义顶点可能很有用,但我不明白为什么。

2 个答案:

答案 0 :(得分:1)

  

是否有合适的方法将多个纹理传递给着色器?

您将glUniform1i()glActiveTexture()一起使用。因此,如果您的片段着色器有多个uniform sampler2D

uniform sampler2D tex1;
uniform sampler2D tex2;

然后在设置着色器时,将采样器制服设置为您希望与之关联的纹理单元:

glUniform1i(glGetUniformLocation(program, "tex1"), 0)
glUniform1i(glGetUniformLocation(program, "tex2"), 1)

然后将活动纹理设置为GL_TEXTURE0GL_TEXTURE1并绑定纹理。

glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texture1)

glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, texture2)
  

我应该如何跟踪面部以呈现正确的纹理?

这取决于你想要什么。

  • 您可以根据法线确定要使用的纹理(通常使用三平面纹理贴图完成)。
  • 您还可以使用另一个属性来决定两个纹理之间的交叉淡入淡出量。

    color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
    
  • 和以前一样,你可以同样拥有uniform float transition。这样可以让你在纹理之间淡入淡出,可以像在PowerPoint中那样在幻灯片之间淡入淡出,可以这么说。

尝试阅读LearnOpenGL's Textures tutorial

最后,至少有80个纹理单位。您可以使用GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS具体检查可用的数量。

答案 1 :(得分:0)

您可以使用索引缓冲区。定义顶点一次,然后使用一个索引缓冲区用第一个纹理绘制网格的一部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分。

这里是通用公式:

  1. 设置顶点缓冲区
  2. 设置着色器
  3. 设置第一个纹理
  4. 为应使用第一个纹理
  5. 的网格部分设置并绘制索引缓冲区
  6. 设置第二个纹理
  7. 为应使用第二个纹理的网格部分设置并绘制索引缓冲区。