2 回答

TA貢獻1776條經驗 獲得超12個贊
你只有單身 sampler2D
這意味著您只有一個紋理可供您使用
不管你綁定了多少。
如果您確實需要將數據作為單個塊傳遞
那么你應該為你得到的每個紋理添加采樣器
不確定你有多少對象/紋理
但是通過這種數據傳遞方式,您受到紋理單元的 gfx hw 限制
您還需要在數據中添加另一個值,告訴哪個圖元使用哪個紋理單元
然后在片段內部選擇正確的紋理采樣器......
你應該添加這樣的東西:
// vertex
in int usedtexture;
out int txr;
void main()
{
txr=usedtexture;
}
// fragment
uniform sampler2D myTextureSampler0;
uniform sampler2D myTextureSampler1;
uniform sampler2D myTextureSampler2;
uniform sampler2D myTextureSampler3;
in vec2 UV;
in int txr;
out vec4 color;
void main
{
if (txr==0) color = texture2D( myTextureSampler0, UV ).rgba;
else if (txr==1) color = texture2D( myTextureSampler1, UV ).rgba;
else if (txr==2) color = texture2D( myTextureSampler2, UV ).rgba;
else if (txr==3) color = texture2D( myTextureSampler3, UV ).rgba;
else color=vec4(0.0,0.0,0.0,0.0);
}
由于以下原因,這種傳遞方式并不好:
使用的紋理數量僅限于硬件紋理單元限制
如果您的渲染需要額外的紋理,如法線/光澤度/光照貼圖
那么每個對象類型需要超過 1 個紋理,并且您的限制突然除以 2,3,4 ...
您需要
if/switch
片段內的語句,這會大大減慢速度是的,您可以少吃早午餐,但是您需要一直訪問所有紋理,從而無緣無故地增加 gfx 的熱應力...
這種傳球適合
單個圖像中的所有紋理(正如你提到的紋理圖集)
對于具有少量對象類型(或材料)但對象數量較多的場景,這種方式可以更快并且合理......
添加回答
舉報