簡體   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