簡體   English   中英

GLSL傳遞整數頂點屬性

[英]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列出了大小和類型的允許值。 對於類型,值BYTEUNSIGNED_BYTESHORTUNSIGNED_SHORTFIXEDFLOAT指示類型byteubyteshortushortfixedfloat

WebGL不支持FIXED

浮點數整數大小相同(32位),並且浮點數最多可以表示1600萬個整數,而不會損失精度,因此,除非需要的值大於1600萬,否則可以只使用浮點數

否則,在您的示例中,您只能訪問64個骨骼。 為什么不只使用UNSIGNED_BYTEUNSIGNED_SHORT

您可能還需要考慮將骨骼矩陣存儲在紋理中,這樣您就不會用完制服,因為許多設備的制服可能比您的PC少得多

看到

您如何在WebGL中做皮膚

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM