GLSL纹理贴图,最大纹理数 我正在研究一个C++ GLSL渲染器。我知道了如何在GLSL中映射多个纹理。使用“glActiveTexture(GL_TEXTURE0)”我可以告诉我的着色器要加载哪个纹理。唯一的问题是常量GL_TEXTURE0,GL_TEXTURE1,只能转到GL\u TEXTURE31。这是否意味着您只能为场景加载32个纹理?当然不是
例如:GLSL纹理贴图,最大纹理数 我正在研究一个C++ GLSL渲染器。我知道了如何在GLSL中映射多个纹理。使用“glActiveTexture(GL_TEXTURE0)”我可以告诉我的着色器要加载哪个纹理。唯一的问题是常量GL_TEXTURE0,GL_TEXTURE1,只能转到GL\u TEXTURE31。这是否意味着您只能为场景加载32个纹理?当然不是,c++,opengl,glsl,C++,Opengl,Glsl,例如: 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); glTexP
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);
。。。
稍后在我的绘图函数中
。。。
如果变量“val”设置为0,则来自image1的纹理数据将映射到我的着色器;如果变量“val”设置为1,则来自image2的纹理数据将映射到我的着色器。
我做错了什么,我怎么能加载超过32个纹理?常数只会上升到
GL\u TEXTURE31
,因为这是GL3所需要的全部。每个着色器阶段需要16个纹理图像单元,而GL3只有2个阶段(顶点和片段)
后来,GL(3.2)将几何体着色器升级为核心,因此纹理图像单元的最小数量变为48个(因此,GL_TEXTURE47
将是实现必须定义的最高数量)
GL4添加了细分评估/控制阶段,将最小值提升到80(16 x 5阶段)。然而,在这一点上,大多数人不再使用常量,而是使用GL_TEXTURE0
+N来描述第N个纹理图像单元
就可以加载的纹理数量而言,这与实现支持的纹理图像单元的数量完全无关。纹理图像单元是绑定位置,它们与可以在着色器的单个调用中应用的最大纹理数(即每次调用)相关
如果在着色器阶段需要16个以上的纹理,则始终可以使用多个过程,但我认为您将“加载”纹理与将纹理绑定到纹理图像单元相混淆。在学习了红皮书第6章之后,我完全明白了这一点。您不希望将不同的纹理绑定到不同的纹理图像单元,除非希望它们像法线贴图一样显示为不同的层。很抱歉我没有OpenGL术语,有时候当我快速发布消息时,我没有使用正确的术语。
int handle_loc = glGetUniformLocation( ProgramHandle, "Tex1" );
glUniform1i( handle_loc, val );