繁体   English   中英

GLSL纹理映射,最大纹理数量

[英]GLSL Texture Mapping, Max number of textures

我正在研究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个以上的纹理?

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

后来在GL(3.2)上将Geometry Shaders提升为核心,因此纹理图像单元的最小数量变为48(因此GL_TEXTURE47将是实现必须定义的最高数量)。

GL4增加了镶嵌细分评估/控制阶段,该阶段将最小值提高到80 (16 x 5阶段) 然而,在这一点上,大多数人停止使用常量,而只是使用GL_TEXTURE0 + N来描述第N个纹理图像单元。


至于可以加载的纹理数量,这完全独立于实现支持的纹理图像单元的数量。 纹理图像单元是绑定位置,它们与您在一次着色器调用(即,每遍)中可以应用的最大纹理数量有关。

如果在着色器阶段需要16个以上的纹理,则始终可以采用多次遍历,但是我认为将纹理“加载”与将其绑定到纹理图像单元会令人困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM