2012-02-17 6 views
2

私は現在GPLスキンを設定しようとしていますが(glslで)、それは私のやり方では機能しません:)実際は全く動作していません。私のメッシュは、私は、このGLSLコードしようとすると消える:Glslスキニングの障害、誰がそれをジャンプすることができますか?

layout(location = 0) in vec3 vertexPos; 
layout(location = 1) in vec2 vertexUv; 
layout(location = 2) in vec3 vertexNor; 
layout(location = 5) in ivec4 joints_influences; 
layout(location = 6) in vec4 weights_influences; 

uniform mat4 ViewProj, View, Proj, Model; 
out vec3  vertexPosEye; 
out vec3  vertexNorEye; 

const int  MAX_INFLUENCES = 4; 
const int  MAX_BONES = 50; 
uniform mat4 animation_matrices[MAX_BONES]; 
uniform mat4 inv_bind_matrices[MAX_BONES]; 

void main() 
{ 
    vertexPosEye = (View * Model * vec4(vertexPos, 1)).xyz;  // Position 
    vertexNorEye = (View * Model * vec4(vertexNor, 0)).xyz;  // Normal matrix 

    vec4 final_v = vec4(0, 0, 0, 0); 

    for (int i = 0; i < MAX_INFLUENCES; i++) 
    { 
     vec4 v =  vec4(vertexPos, 1) 
        * inv_bind_matrices[joints_influences[i]] 
        * animation_matrices[joints_influences[i]] 
        * weights_influences[i]; 

     final_v += v; 
    } 
    gl_Position = ViewProj * Model * final_v; 
} 

を、私はこのしようとすると:

gl_Position = ViewProj * Model * vertexPos; 

を...私のメッシュはもちろん、もはや何のアニメーションバックではありません:)しかし

をここに私です私はVBOを設定アプリケーション(C++)コード属性:メインループにおいて

// Vertex position 
glGenBuffers(1, &buffer[0]); 
glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); 
glBufferData(GL_ARRAY_BUFFER, vertices.pos.size() * sizeof(bVector3), &vertices.pos[0], GL_STATIC_DRAW); 

// Ibid for uv, normals, tangents and bitangents. 

// Skinning : joints index 
glGenBuffers(1, &buffer[5]); 
glBindBuffer(GL_ARRAY_BUFFER, buffer[5]); 
glBufferData(GL_ARRAY_BUFFER, vertices.joints.size() * sizeof(SkinningJoints), &vertices.joints[0], GL_STATIC_DRAW); 

// Skinning : weights 
glGenBuffers(1, &buffer[6]); 
glBindBuffer(GL_ARRAY_BUFFER, buffer[6]); 
glBufferData(GL_ARRAY_BUFFER, vertices.weights.size() * sizeof(SkinningWeights), &vertices.weights[0], GL_STATIC_DRAW); 

// Indices 
glGenBuffers(1, &buffer[7]); 
glBindBuffer(GL_ARRAY_BUFFER, buffer[7]); 
glBufferData(GL_ARRAY_BUFFER, vertices.indices.size() * sizeof(bUshort), &vertices.indices[0], GL_STATIC_DRAW); 

:0

ここで
glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, m->GetBuffer(0)); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

glEnableVertexAttribArray(for uv, normals, tangents and bitangents)... 

glEnableVertexAttribArray(5); 
glBindBuffer(GL_ARRAY_BUFFER, m->GetBuffer(5)); 
glVertexAttribPointer(5, 4, GL_INT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

glEnableVertexAttribArray(6); 
glBindBuffer(GL_ARRAY_BUFFER, m->GetBuffer(6)); 
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->GetBuffer(7)); 
glDrawElements(GL_TRIANGLES, m->vertices.indices.size(), GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); 

私RenderingVertices構造体(バールのアーティスト同士のコラボレーションの後)である:私のSkinningJointsは構造体です

struct RenderingVertices 
{ 
    // std::vector<Vec3> 
    vVec3      pos, nor, tang, btan; 
    vVec2      uv; 
    vUshort      indices; 

    vector<SkinningJoints>  joints; 
    vector<SkinningWeights>  weights; 
}; 

そして、ここで:

struct SkinningJoints 
{ 
    int   j[MAX_BONES_PER_VERT]; 

    SkinningJoints(Vertex::Weights weights[MAX_BONES_PER_VERT]) 
    { 
     for (bUint i = 0; i < MAX_BONES_PER_VERT; i++) 
      j[i] = weights[i].jid; 
    } 
}; 

をマイSkinningWeights構造体は、配列と、ほぼ同じですintではなくfloat。

今、私は関節指数をデバッグしようとすると、重み値と最終頂点色など、ここで私が得るものです:

// Shader 
color_debug = joints_influences; 

http://www.images-host.fr/view.php?img=00021800pop.jpg

color_debug = weights_influences; 

http://www.images-host.fr/view.php?img=00021800pop2.jpg

もう一つの興味深いです私はこれを試してみると、

vec4 pop = vec4(vertexPos, 1) * animation_matrices[1] * inv_bind_matrices[1] * 1.0; 
gl_Position = ViewProj * Model * pop; 

私はすべてのメッシュが実際に回転しています。つまり、私の均一なanimation_matricesは良いです。

誰でも私がここで間違っているのを見ることができますか?

答えて

2

スキニング属性のデバッグを試しましたか?意味のある値を持つことを確認できるように、頂点の重さを色として出力しますか?すべてが黒であれば、どこを見るかを知るでしょう。

RenderingVerticesをすばやく見ると、私は最初の問題を見つけることができます。あなたは私があなたがしたいとは思わないGLへのポインタのベクトルを渡しています。

ほとんどの場合、スキンイングの影響を頂点ごとに4つのジョイント/ウェイトペアに制限します。だから、あなたは単純な配列(すなわち、Skinningジョイントジョイント[4];)で逃げることができます。

+0

ここでは、「layout(location = 6)」をvec4 weights_influencesに入れたときの結果を示します。色として。 http://www.images-host.fr/view.php?img=17021756pop.jpg –

4

私はついにそれを働かせました。

私が代わりにこれを行うための、GLSLにジョイントインデックス配列を送信

glEnableVertexAttribArray(5); 
glBindBuffer(GL_ARRAY_BUFFER, m->GetBuffer(5)); 
glVertexAttribIPointer(5, 4, GL_INT, 0, BUFFER_OFFSET(0)); 

glEnableVertexAttribArray(5); 
glBindBuffer(GL_ARRAY_BUFFER, m->GetBuffer(5)); 
glVertexAttribPointer(5, 4, GL_INT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

私はこれを行うために必要な興味があるかもしれない人のために、ここで私が間違って何をしていたかであります

あなたは違いを見つけるために注意深く見なければなりません。 glVertexAttribPointer()を呼び出す代わりに、関節のインデックスがintであるため、glVertexAttribIPointer()を呼び出す必要がありました。

これはいつか誰かを助けることを願っています。

関連する問題