C++ OpenGL混淆了多重纹理
我正在用OpenGL 3.3开发一个3d程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要纹理所有立方体的所有面都有一个共同的纹理,除了一个面应该有不同的纹理。我尝试使用一种纹理,但当我尝试添加另一种纹理时,程序的行为似乎是随机的。C++ OpenGL混淆了多重纹理,c++,opengl,textures,texture-mapping,C++,Opengl,Textures,Texture Mapping,我正在用OpenGL 3.3开发一个3d程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要纹理所有立方体的所有面都有一个共同的纹理,除了一个面应该有不同的纹理。我尝试使用一种纹理,但当我尝试添加另一种纹理时,程序的行为似乎是随机的。 我的问题: 是否有合适的方法将多个纹理传递给着色器? 如何跟踪面以渲染正确的纹理? 通过谷歌搜索,我发现定义两次顶点可能很有用,但我真的不明白为什么。可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲
我的问题:
是否有合适的方法将多个纹理传递给着色器?
如何跟踪面以渲染正确的纹理?
通过谷歌搜索,我发现定义两次顶点可能很有用,但我真的不明白为什么。可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分 以下是一般公式:
您可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分 以下是一般公式:
统一采样器2D
:
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)
为了渲染正确的纹理,我应该如何跟踪面
这取决于你想要什么
- 您可以根据法线决定使用哪个纹理(通常使用三平面纹理贴图)
- 您还可以使用另一个属性来决定两个纹理之间的交叉淡入度
color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
- 像以前一样,您可以同样地进行
。这将允许您在纹理之间淡入淡出,从而可以像在PowerPoint中一样在幻灯片之间淡入淡出均匀浮点转换
GL\u MAX\u COMBINED\u TEXTURE\u IMAGE\u UNITS
具体检查可用的数量
是否有合适的方法将多个纹理传递给着色器
你会和我一起使用。因此,给定片段着色器具有多个统一采样器2D
:
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)
为了渲染正确的纹理,我应该如何跟踪面
这取决于你想要什么
- 您可以根据法线决定使用哪个纹理(通常使用三平面纹理贴图)
- 您还可以使用另一个属性来决定两个纹理之间的交叉淡入度
color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
- 像以前一样,您可以同样地进行
。这将允许您在纹理之间淡入淡出,从而可以像在PowerPoint中一样在幻灯片之间淡入淡出均匀浮点转换
GL\u MAX\u COMBINED\u TEXTURE\u IMAGE\u UNITS
具体检查您有多少可用的单元。此外,您应该检查哪些单元更适合回答这些类型的问题。此外,您还应该检查哪些单元更适合回答这些类型的问题。