[英]GLSL Passing integer vertex attribute
我正在使用opengles 2.0。 我試圖將一個整數值傳遞給頂點着色器。 我的客戶代碼是這樣的:
glEnableVertexAttribArray(3); // Bones
glVertexAttribPointer(3, 4, GL_UNSIGNED_SHORT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
頂點着色器代碼為:
attribute vec4 vBones;
uniform Bone bones[64];
gl_Position = bones[int(vBones.x)].transform * bones[int(vBones.x)].bindPose * vec4(vPosition, 1.0) * vWeights.x;
如果我按原樣編譯代碼。 所有的“ vBones.xyzw”都變為0,而我得到一個沒有蒙皮的網格。 因為0是指一個單位矩陣。
如果我將客戶端代碼更改為此:
glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
代碼在Windows中運行時沒有任何錯誤。 但是,當我通過emscripten將其編譯為webgl時,出現gl錯誤1282(無效操作)
簡而言之,您能否舉一個將int頂點屬性傳遞給glsl的示例?
WebGL 1.0和GLSL ES 1.0X不支持將GL_INT傳遞給頂點着色器。
從規范第2.8節開始
表2.4列出了大小和類型的允許值。 對於類型,值
BYTE
,UNSIGNED_BYTE
,SHORT
,UNSIGNED_SHORT
,FIXED
和FLOAT
指示類型byte
,ubyte
,short
,ushort
,fixed
和float
。
WebGL不支持FIXED
浮點數和整數大小相同(32位),並且浮點數最多可以表示1600萬個整數,而不會損失精度,因此,除非需要的值大於1600萬,否則可以只使用浮點數
否則,在您的示例中,您只能訪問64個骨骼。 為什么不只使用UNSIGNED_BYTE
或UNSIGNED_SHORT
?
您可能還需要考慮將骨骼矩陣存儲在紋理中,這樣您就不會用完制服,因為許多設備的制服可能比您的PC少得多
看到
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.