GLSL纹理映射,最大纹理数

时间:2014-03-09 00:48:50

标签: c++ opengl glsl

我正在研究C ++ GLSL渲染器。我想出了如何在GLSL中映射多个纹理。使用“glActiveTexture(GL_TEXTURE0)”我可以告诉我的着色器加载哪种纹理。唯一的问题是常量GL_TEXTURE0GL_TEXTURE1,......,只能达到GL_TEXTURE31。这是否意味着您只能为场景加载32个纹理?当然不是。

示例:

unsigned int textureIDs[2];

glGenTextures(2, textureIDs);

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, textureIDs[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image1.x, image1.y, 0, GL_RGB, GL_UNSIGNED_BYTE, image1.data);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, textureIDs[1]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image2.x, image2.y, 0, GL_RGB, GL_UNSIGNED_BYTE, image2.data);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

... 后来在我的绘图功能 ...

int handle_loc = glGetUniformLocation( ProgramHandle, "Tex1" );

glUniform1i( handle_loc, val );

... 如果变量“val”设置为0,则image1的纹理数据将映射到我的着色器,如果设置为1,则image2的纹理数据将映射到我的着色器。 ...

我做错了什么,如何加载超过32种纹理?

1 个答案:

答案 0 :(得分:5)

该常数仅上升到GL_TEXTURE31,因为这是GL3所需的全部内容。每个着色器阶段需要16个纹理图像单元,而GL3只有2个阶段(顶点和片段)。

后来GL(3.2)将几何着色器提升为核心,因此纹理图像单元的最小数量变为48(因此GL_TEXTURE47将是实现必须定义的最高值。)

GL4增加了曲面细分评估/控制阶段,最低可达80 (16 x 5阶段)。但是,此时大多数人都停止使用常量,只需使用GL_TEXTURE0 + N 来描述第N个纹理图像单元。


就可以加载的纹理数量而言,这完全独立于实现支持的纹理图像单元的数量。纹理图像单元是绑定位置,它们与您在着色器的单次调用中应用的最大纹理数相关(换句话说,每次通过)。

如果在着色器阶段需要超过16个纹理,您总是可以求助于多次传递,但我认为您将纹理“加载”并将它们绑定到纹理图像单元时会感到困惑。