1

照明が機能せず、オブジェクトが単色で表示されます。色自体は、マテリアルまたは照明パラメーターによって変化しますが、影や単色の灰色はありません。

コードの一部を次に示します。

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glFrontFace(GL_CCW);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);

GLfloat amb[] = {0.6, 0.6, 0.6, 1.0};
GLfloat dif[] = {0.8, 0.8, 0.8, 1.0};
GLfloat spec[] = {0.5, 0.5, 0.5, 1.0};
GLfloat pos[] = {0.0, 0.0, 30.0};

glEnable(GL_LIGHT0);    

glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
glLightfv(GL_LIGHT0, GL_POSITION, pos);


GLfloat co[4]={0.5, 0.5, 0.5, 0.5};
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 1.0 }; 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, co);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

for(int i=0; i < numofTr; i++)
{       
glBegin(GL_TRIANGLES);
  glNormal3f(tr[i].v1->n.x, tr[i].v1->n.y, tr[i].v1->n.z);
  glVertex3f(tr[i].v1->x, tr[i].v1->y, tr[i].v1->z);    
  glNormal3f(tr[i].v2->n.x, tr[i].v2->n.y, tr[i].v2->n.z);
  glVertex3f(tr[i].v2->x, tr[i].v2->y, tr[i].v2->z);    
  glNormal3f(tr[i].v3->n.x, tr[i].v3->n.y, tr[i].v3->n.z);
  glVertex3f(tr[i].v3->x, tr[i].v3->y, tr[i].v3->z);    
glEnd();
}

何が欠けているのかわかりません。法線は、オブジェクトと一緒に表示すると見栄えがします。

4

1 に答える 1

2

グレーのオブジェクトに薄暗いライトを使用しています。明らかに結果は灰色です。

面がフラット シェーディングされていることを意味する場合、それはglShadeModel(GL_FLAT);. GL_SMOOTH補間を有効にするには、 に変更します。

オブジェクトが 3D の場合、位置として 3 つの float しか渡していないという事実が関係していると思います。デフォルト値は[0,0,1,0]で、関数は 4 つの float を想定しています (4 番目は W 座標で、ほとんどの場合 1 に等しいか、無限距離のライトの場合は 0 になります)。

また、あなたが与えたデータが正しいことglVertexを再確認してください。glNormal球を 0,0,0 でレンダリングする場合、すべての頂点の法線は、そのような頂点の正規化された位置です (明らかに、球に対してのみ保持されます)。


補足として、このコードは明らかに時代遅れです。免責事項として、学習のみを目的としている場合は、それをすべて破棄し、比較的最新でプログラム可能なパイプラインを使用するものに切り替えます。

于 2013-05-10T16:16:58.727 に答える