OpenGL 对多个纹理感到困惑
OpenGL confused about multiple textures
我正在使用 OpenGL 3.3 开发 3d 程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要用一个共同的纹理对所有立方体的所有面进行纹理处理,除了一个应该具有不同纹理的面。我尝试使用单一纹理,一切正常,但当我尝试添加另一个纹理时,程序似乎随机运行。
我的问题:
是否有合适的方法将多个纹理传递给着色器?
我应该如何跟踪面部以渲染正确的纹理?
谷歌搜索我发现定义顶点两次可能很有用,但我真的不明白为什么。
您可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制网格中具有第一个纹理的部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分。
这是通用公式:
- 设置顶点缓冲区
- 设置着色器
- 设置第一个纹理
- 为应使用第一个纹理的网格部分设置并绘制索引缓冲区
- 设置第二个纹理
- 为应该使用第二个纹理的网格部分设置并绘制索引缓冲区。
Is there a suitable way of passing multiple textures to the shaders?
您会使用 glUniform1i()
along with glActiveTexture()
。因此,鉴于您的片段着色器有多个 uniform sampler2D
:
uniform sampler2D tex1;
uniform sampler2D tex2;
然后在设置着色器时,将采样器制服设置为您希望它们关联的纹理单元:
glUniform1i(glGetUniformLocation(program, "tex1"), 0)
glUniform1i(glGetUniformLocation(program, "tex2"), 1)
然后将活动纹理设置为 GL_TEXTURE0
或 GL_TEXTURE1
并绑定一个纹理。
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texture1)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, texture2)
How am I supposed to keep track of faces in order to render the right texture?
这取决于你想要什么。
- 您可以根据法线决定使用哪个纹理(通常使用三平面纹理映射完成)。
您还可以使用另一个属性来决定两个纹理之间的淡入淡出程度。
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
.
检查具体有多少可用
我正在使用 OpenGL 3.3 开发 3d 程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要用一个共同的纹理对所有立方体的所有面进行纹理处理,除了一个应该具有不同纹理的面。我尝试使用单一纹理,一切正常,但当我尝试添加另一个纹理时,程序似乎随机运行。
我的问题:
是否有合适的方法将多个纹理传递给着色器?
我应该如何跟踪面部以渲染正确的纹理?
谷歌搜索我发现定义顶点两次可能很有用,但我真的不明白为什么。
您可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制网格中具有第一个纹理的部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分。
这是通用公式:
- 设置顶点缓冲区
- 设置着色器
- 设置第一个纹理
- 为应使用第一个纹理的网格部分设置并绘制索引缓冲区
- 设置第二个纹理
- 为应该使用第二个纹理的网格部分设置并绘制索引缓冲区。
Is there a suitable way of passing multiple textures to the shaders?
您会使用 glUniform1i()
along with glActiveTexture()
。因此,鉴于您的片段着色器有多个 uniform sampler2D
:
uniform sampler2D tex1;
uniform sampler2D tex2;
然后在设置着色器时,将采样器制服设置为您希望它们关联的纹理单元:
glUniform1i(glGetUniformLocation(program, "tex1"), 0)
glUniform1i(glGetUniformLocation(program, "tex2"), 1)
然后将活动纹理设置为 GL_TEXTURE0
或 GL_TEXTURE1
并绑定一个纹理。
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texture1)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, texture2)
How am I supposed to keep track of faces in order to render the right texture?
这取决于你想要什么。
- 您可以根据法线决定使用哪个纹理(通常使用三平面纹理映射完成)。
您还可以使用另一个属性来决定两个纹理之间的淡入淡出程度。
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
.