2011-01-10 18 views
1

OBS & 3DS MaxからエクスポートされたMTLファイルは完全なチェスセットです。私の最終的な結果では、ゲームピース&を選択して、正方形を選択して移動することもできます。私は一緒に抱き合わせ問題を抱えてい要素は次のとおりです。3Dオブジェクトをシェーダで描画する適切な方法は何ですか?

  • オブジェクトの選択
  • シェーダ

私は私のオブジェクトの輸入二つの方法で作業を持っています。

1)同じような素材ですべてをグループ化し、Meshという構造体にグループ化し、各フレームを描画するmodel.meshesをループします。

2)ボード、各四角形、各ゲームピース&を特定し、関連する頂点、マテリアルなどをGroupObjectという構造体に配置します。それらはmodel.objectsに置かれ、各フレームの描画をループします。

#1と#2で説明した各オプションの外観を示すスクリーンショットです。 SSの上半分では、メッシュを描き、すべてのシェーディングが正しいように見えますが、何も選択できません。一番下の1/2では、ゲームピースや正方形を選択することはできますが、モデルはうんざりのように見えます。

http://img815.imageshack.us/img815/2158/chesst.png

私は#2からのコードでシェーダーを使用する場合はさらに、&ズームをパンすると、クロールに遅くなります。それはほぼ完全に反応しません。

ここは、フレームごとにオブジェクトを描画するために呼び出されるメソッドです。最初の2つのコメント行は、私がオプション1を試して、ちょうど私の構造体を描画するところです。Meshはうまく見えます。回転&ズームもスムーズですが、オブジェクトb/cを選択できません。MeshのglPushNameを実行できません。現在、コードはを実行することができるように、それぞれmodel.objectsをループして設定されています。これは、ゲームピースまたはスクエアのピッキング/選択に必要です。私がしようとするとmodel.objectsをループするときに、非常に遅いシェーダを適用する場所をコメントアウト部分がある。ここ

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//for (int i = 0; i < model.getNumberOfMeshes(); ++i) 
//{ 
for (int i = 0; i < (int)model.objects.size(); i++) 
{ 
    ModelOBJ::GroupObject *object = model.objects[i]; 

    glPushName((int)object); 

    int faceSize = (int)object->faces.size(); 

    for (int j = 0; j < faceSize; j++) 
    { 

     ModelOBJ::Face *face = object->faces[j]; 
     pMaterial = &model.getMaterial(face->materialId); 


     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat *)pMaterial->ambient); 
     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat *)pMaterial->diffuse); 
     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *)pMaterial->specular); 
     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, pMaterial->shininess * 128.0f); 

     glDisable(GL_TEXTURE_2D); 
     drawFace(*face); 

     //if (pMaterial->bumpMapFilename.empty()) 
     //{ 
      // Per fragment Blinn-Phong code path. 

     // glUseProgram(blinnPhongShader); 

     // // Bind the color map texture. 

     // texture = nullTexture; 

     // if (enableTextures) 
     // { 
     //  iter = modelTextures.find(pMaterial->colorMapFilename); 

     //  if (iter != modelTextures.end()) 
     //   texture = iter->second; 
     // } 

     // glActiveTexture(GL_TEXTURE0); 
     // glEnable(GL_TEXTURE_2D); 
     // glBindTexture(GL_TEXTURE_2D, texture); 

     // // Update shader parameters. 

     // glUniform1i(glGetUniformLocation(
     //  blinnPhongShader, "colorMap"), 0); 
     // glUniform1f(glGetUniformLocation(
     //  blinnPhongShader, "materialAlpha"), pMaterial->alpha); 
     //}   
    } 
    glPopName(); 
} 

glBindTexture(GL_TEXTURE_2D, 0); 
glUseProgram(0); 
glDisable(GL_BLEND); 

は、それが関連性の場合にはdrawFace方法である( model.mesh年代をループするとき何も遅くない)

void GLEngine::drawFace(ModelOBJ::Face &face) 
{ 
if ((int)face.numVertices <= 3) 
    glBegin(GL_TRIANGLES); 
else 
    glBegin(GL_POLYGON); 

for (int v = 0; v < (int)face.numVertices; v++) 
{ 
    if ((int)face.numUVWs > v && face.UVWs != NULL) 
     glTexCoord2f(face.UVWs[v]->x, face.UVWs[v]->y); 

    if ((int)face.numNormals > v && face.normals != NULL) 
     glTexCoord3d(face.normals[v]->x, face.normals[v]->y, face.normals[v]->z); 

    if ((int)face.numVertices > v && face.vertices != NULL) 
     glVertex3f(face.vertices[v]->x, face.vertices[v]->y, face.vertices[v]->z); 
} 
glEnd(); 
} 

そして、ここで私はどのようにこれらの機能のすべてを一緒にマージします

Per-fragment Blinn-Phong shader for a single directional light source. 

[vert] 


varying vec3 normal; 

void main() 
{ 
    normal = normalize(gl_NormalMatrix * gl_Normal); 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0;  
} 

[frag] 


uniform sampler2D colorMap; 
uniform float materialAlpha; 

varying vec3 normal; 

void main() 
{ 
    vec3 n = normalize(normal); 

    float nDotL = max(0.0, dot(n, gl_LightSource[0].position.xyz)); 
    float nDotH = max(0.0, dot(normal, vec3(gl_LightSource[0].halfVector))); 
    float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess); 

    vec4 ambient = gl_FrontLightProduct[0].ambient; 
    vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL; 
    vec4 specular = gl_FrontLightProduct[0].specular * power; 
    vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular; 

    gl_FragColor = color * texture2D(colorMap, gl_TexCoord[0].st); 
    gl_FragColor.a = materialAlpha; 
} 

を使用していますシェーダのですか?私の最初の考えは、材料情報のないmodel.objectsをすべて描き、それらを透明にすることです。次に、2番目のループを実行し、&のすべてのmodel.meshesをシェーダを使用して描画します。しかし、私は新しい正方形にゲームの部分を動かすときに、その部分の新しい位置に適切なシェーディングが適用されていることをどうやって確認するのだろうと思いました。透明なGroupObjectを選択して新しい正方形に変換すると、その部分にはまだ適切なシェーディングがありますか?

私が抱えている問題を解決する最良の方法は何ですか?

答えて

1

テクスチャGLEngine::drawFaceの座標としてなぜあなたはあなたの通常のを送ってください:あなたがここに見ることができるよう

glTexCoord3d(face.normals[v]->x, face.normals[v]->y, face.normals[v]->z); 

あなたシェーダは、それがglNormal3dようであることを期待:

normal = normalize(gl_NormalMatrix * gl_Normal); 
+0

うーん。それは間違いのようです。私は今夜​​それを変更して何が起こるかを見てみましょう – Nathan

+0

また、それはdrawFaceでシェーダを使用するときにすべてがクロールに遅くなる理由と関係していると思いますか? – Nathan

+0

私は3ds maxからエクスポートしたときにそれらを三角形にしなければならなかったと思いますので、glBegin&glEndをface.size()ループの外側で試してみます。私は今夜​​報告します。お返事ありがとうございました! – Nathan

関連する問題