[英]OpenGL confused about multiple textures
我正在使用OpenGL 3.3开发3d程序。 到目前为止,我设法渲染了许多立方体和一些球体。 我需要使用共同的纹理对所有多维数据集的所有面进行纹理化,除了一个面应该具有不同的纹理。 我尝试使用单个纹理,但一切正常,但是当我尝试添加另一个纹理时,该程序似乎在随机运行。
我的问题:
有没有合适的方法将多个纹理传递给着色器?
我应该如何跟踪面部以渲染正确的纹理?
在谷歌搜索中,我发现两次定义顶点可能很有用,但是我并没有真正理解为什么。
是否有合适的方法将多个纹理传递给着色器?
您将使用glUniform1i()
和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)
我应该如何跟踪面孔以渲染正确的纹理?
这取决于您想要什么。
您还可以具有另一个属性,该属性确定两个纹理之间的淡入淡出量。
color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
像以前一样,您同样可以具有uniform float transition
。 这将让你的纹理之间褪色,从而能够幻灯片之间褪色像在PowerPoint中,可以这么说。
尝试阅读LearnOpenGL的Textures教程 。
最后,至少有80个纹理单位。 您可以使用GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
具体检查可用的GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
。
您可以使用索引缓冲区。 定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分。
这是一般公式:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.