2016-08-14 4 views
-1

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 행렬이므로 아무 것도 사용하지 않습니다.

+0

저는 glVertexAttribIPointer를 사용하여 정점 속성을 바인딩합니다. 나는 ivec4에서 vec4로 변경하고 float에서 int로 인덱스를 캐스팅했습니다. 뼈 지수가 0에서 64 사이이므로 안전하다고 생각합니다. – Cihan

답변

1

정수 속성은 ES 2.0에서 지원되지 않습니다. 데이터 유형은 VEC2, VEC3, vec4, mat2, mat3 및 mat4 플로트에서만 사용할 수

속성 한정자 (ES 2.0 사용 GLSL 버전 임) GLSL ES 1.00 규격에서.

가장 가까운 방법은 셰이더 코드에서 vec4을 사용하고 필요에 따라 부동 소수점 값을 정수로 변환하는 것입니다.

클라이언트 측의 데이터가 정수 형식 인 경우 glVertexAttribPointer() 호출에주의해야합니다. 네 번째 인수로 전달 된 부울은 값을 정규화 할 것인지 또는 정규화하지 않고 부동으로 변환해야 하는지를 지정합니다. 귀하의 경우에는 GL_FALSE을 전달해야합니다. 예를 들어, 클라이언트 코드에 바이트 데이터가있는 경우 :

glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0); 

ES 3.0 이상은 정수 속성을 지원합니다. 따라서 여기에 속성에 ivec4을 사용하고 클라이언트 코드에서 glVertexAttribIPointer() (함수 이름에 I이 추가 된 것에 유의하십시오) 값을 지정할 수 있습니다.