OpenGLE 2.0을 사용합니다. 하드웨어 스키닝 작업을하고 있습니다. 나는 ivec4로 뼈 인덱스를 전달하려하지만 컴파일러는 ivec4를 정점 속성으로 사용할 수 없다고 알려줍니다. 이 발언을 어떻게 극복 할 수 있습니까?ivec4를 정점 속성으로 사용 Opengl ES 2.0
여기 내 버텍스 쉐이더 코드입니다.
0(1) : error C7507: OpenGL does not allow attributes of type ivec4
"struct Bone"
"{"
" mat4 transform;"
" mat4 bindPose;"
"};"
"attribute vec3 vPosition;"
"attribute vec3 vNormal;"
"attribute vec2 vTexture;"
"attribute ivec4 vBones;"
"attribute vec4 vWeights;"
"uniform mat4 projectViewModel;"
"uniform Bone bones[64];"
"varying vec3 v_normal;"
"varying vec2 v_texCoord;"
"void main()"
"{"
" gl_Position = bones[vBones.x].transform * bones[vBones.x].bindPose * vec4(vPosition, 1.0) * vWeights.x;"
" gl_Position += bones[vBones.y].transform * bones[vBones.y].bindPose * vec4(vPosition, 1.0) * vWeights.y;"
" gl_Position += bones[vBones.z].transform * bones[vBones.z].bindPose * vec4(vPosition, 1.0) * vWeights.z;"
" gl_Position += bones[vBones.w].transform * bones[vBones.w].bindPose * vec4(vPosition, 1.0) * vWeights.w;"
" gl_Position = projectViewModel * gl_Position;"
" v_texCoord = vTexture;"
" v_normal = vNormal;"
"}";
는 UPDATE : 내가 이야기 한 것처럼
, 나는 쉐이더 코드와 클라이언트 측 코드를 변경했습니다. 다음은 클라이언트 측 코드입니다 :
glEnableVertexAttribArray(3); // Bones
glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
내가 쉐이더 코드에서 뼈 인덱스에 액세스하는 방법이 있습니다 :
gl_Position = bones[int(vBones.x)].transform * bones[int(vBones.x)].bindPose * vec4(vPosition, 1.0) * vWeights.x;
내가 윈도우 PC에서이 코드를 실행합니다. 그것은 잘 작동하지만, 웹 브라우저에 emscripten으로 컴파일했을 때. 1282 (잘못된 연산) 오류가 발생합니다.
GL_FLOAT로 변경하면 gl 오류가 수정되지만 모든 뼈대 색인은 0이되고 bone 0은 단위 행렬이 bindpose 및 worldpose 행렬이므로 아무 것도 사용하지 않습니다.
저는 glVertexAttribIPointer를 사용하여 정점 속성을 바인딩합니다. 나는 ivec4에서 vec4로 변경하고 float에서 int로 인덱스를 캐스팅했습니다. 뼈 지수가 0에서 64 사이이므로 안전하다고 생각합니다. – Cihan