Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GLSL纹理贴图,最大纹理数 我正在研究一个C++ GLSL渲染器。我知道了如何在GLSL中映射多个纹理。使用“glActiveTexture(GL_TEXTURE0)”我可以告诉我的着色器要加载哪个纹理。唯一的问题是常量GL_TEXTURE0,GL_TEXTURE1,只能转到GL\u TEXTURE31。这是否意味着您只能为场景加载32个纹理?当然不是_C++_Opengl_Glsl - Fatal编程技术网

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 );