我知道GL_MAX_TEXTURE_IMAGE_UNITS
计划中可能有OpenGL
个纹理单元。但我们假设我只使用一个。
假设我有5个2D纹理。我可以将它们“映射”到单个纹理单元(TEXTURE0)来渲染所有这些纹理单元。
我的意思是我会这样做:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//specify tex data and tex params for tex1
glBindTexture(GL_TEXTURE_2D, tex2);
//specify tex data and tex params for tex1
所有5个纹理..等等
渲染循环:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//draw
glBindTexture(GL_TEXTURE_2D, tex2);
//draw
所有5个纹理..等等
在片段着色器中,我只使用1个sampler2d变量,该变量初始化为零(对于纹理单元0)
如果这不能正常工作,那么我应该使用5个不同的纹理单位(TEXTURE0, TEXTURE0+1, ....TEXTURE0+5
)并将每个纹理“映射”到不同的纹理单元。
最重要的问题:如果我的第一种方法是正确的,那么有多少2D纹理(现在只讨论2D纹理)可以“映射”到纹理单元吗?
答案 0 :(得分:5)
只要您不想同时在单个几何体上使用多个纹理,这是完全可能的。实际上这是常见的事情,因为多纹理和纹理单元的目的是不来为不同的对象保持不同的纹理,但在同一个对象上使用不同的纹理层。
将纹理单位视为Photoshop中的图层。
答案 1 :(得分:2)
好吧,据我了解OpenGL纹理单元:
文本单位是着色器指向采样纹理的一种方法。如果着色器必须访问多个纹理,则必须将它们分隔为不同的纹理单元。
在你的情况下,因为你似乎同时只需要1个纹理,glActiveTexture是没用的,只是让我们的Opengl使用默认的GL_TEXTURE0。
所以,是的,你的渲染循环是正确的。
纹理单位的限制是多少? 48+,绰绰有余!
注意: 请记住,OpenGL是一个状态机,所以要配置多个纹理同时工作,你需要一种方法来选择它们,这正是glActiveTexture所做的。
我希望它会对你有所帮助。