[英]GLSL Texture Mapping, Max number of textures
我正在研究C ++ GLSL渲染器。 我想出了如何在GLSL中映射多個紋理。 使用“ glActiveTexture(GL_TEXTURE0)
”,我可以告訴我的着色器要加載哪個紋理。 唯一的問題是常量GL_TEXTURE0
, GL_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.