2016-08-26 4 views
0

Я использую opengles 2.0. Я пытаюсь передать целочисленное значение в вершинный шейдер. Мой клиент код выглядит так:GLSL Передача целочисленного атрибута вершины

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, и я получаю unskinned сетку. Поскольку 0 относится к единичной матрице.

, если я изменю код клиента к этому:

glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset); 

код работает без anyerror в окнах. Однако, когда я скомпилировал его в webgl через emscripten, я получаю gl error 1282 (Invalid Operation)

Так кратко, можете ли вы привести пример передачи атрибута int vertex в glsl?

+0

'GL_INT' не в списке действительных параметры. Источник: https://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml –

+0

Да, но он отлично работает в Windows :) – Cihan

+0

Поскольку вы, скорее всего, не используете OpenGL ES для Windows. –

ответ

0

WebGL 1.0 и GLSL ES 1.0X не поддерживают передачу GL_INT вершинным шейдерам.

В разделе спецификации 2,8

enter image description here таблице 2.4 указаны допустимые значения для размера и типа . Для типа приведены значения BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, FIXED и FLOAT, указывают типы byte, ubyte, short, ushort, fixed и float соответственно

FIXED не поддерживается в WebGL

буев и Ints имеют одинаковый размер (32 бит) и floats can represent ints up to 16 million with no loss of precision, поэтому, если вам не нужны значения> 16 миллионов, вы можете просто использовать поплавки

В противном случае в вашем примере ваши косы доступа, и у вас всего 64 кости. Почему бы просто не использовать UNSIGNED_BYTE или UNSIGNED_SHORT?

Вы также можете рассмотреть возможность хранить ваши матрицы кости в текстурах, так что вы не кончатся униформы, как many devices probably have a lot fewer uniforms than your PC

См

How do you do skinning in WebGL