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
を選択して新しい正方形に変換すると、その部分にはまだ適切なシェーディングがありますか?
私が抱えている問題を解決する最良の方法は何ですか?
うーん。それは間違いのようです。私は今夜それを変更して何が起こるかを見てみましょう – Nathan
また、それはdrawFaceでシェーダを使用するときにすべてがクロールに遅くなる理由と関係していると思いますか? – Nathan
私は3ds maxからエクスポートしたときにそれらを三角形にしなければならなかったと思いますので、glBegin&glEndをface.size()ループの外側で試してみます。私は今夜報告します。お返事ありがとうございました! – Nathan