0

OpenGL のライトに問題があります:

このコードでボールのライトを変更します:

switch(option) {                                            
case ambient:                                               
  glLightfv(GL_LIGHT0,GL_AMBIENT,lum_ambient);              
  glMaterialfv(GL_FRONT,GL_SPECULAR,mat_ambient);           
  break;                                                    
case diffuse:                                               
  glLightfv(GL_LIGHT0,GL_DIFFUSE,lum_diffuse);              
  glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);            
  break;                                                    
case specular:                                              
  glLightfv(GL_LIGHT0,GL_SPECULAR,lum_speculaire);          
  glMaterialfv(GL_FRONT,GL_SPECULAR,mat_speculaire);        
  break;                                                    
}     

アンビエントからディフューズまたはスペキュラーに変更できます。しかし、一度変更すると、アンビエントに戻ることができず、さらに悪いことに、ディフューズに戻るには、アンビエントを呼び出す必要があります。

そして、私はそれがこのコードから来ているとは思わない:

   switch (key) {                              
   case 27:                                    
       exit(1);                                
   case '1':                                   
     option = ambient;                         
     glutPostRedisplay();                      
     break;                                    
   case '2':                                   
     option = diffuse;                         
     glutPostRedisplay();                      
     break;                                    
   case '3':                                   
     option = specular;                        
     glutPostRedisplay();                      
     break;                                    
   }  

私の問題がどこから来たのか分かりますか?

4

2 に答える 2

3

問題は、他の状態を変更したからといって状態が消えないという事実から生じます。2 つのグローバル変数がある場合:

int x;
int y;

変更yしても には影響しませんx。この switch ステートメントがある場合:

switch(option)
{
case ambient:
  x = 4;
  break;
case diffuse:
  y = 6;
  break;
...
}

これをdiffuseで実行し、次に で実行するとambient、 の値はy? まだ 6です。もちろん、あなたはそれを変更していないので、そうです。

OpenGL には、「アンビエント」、「拡散」、または「スペキュラー」照明はありません。これらはそれぞれ、各ライトの照明モデルにおける異なる用語です。つまり、OpenGL は常に各ライトに対してこれらすべてを実行します。スペキュラー ライティング コンポーネントからの効果が見られない理由は、最初のスペキュラー マテリアル カラーがゼロであるためです。これにより、スペキュラ ライティング コンポーネントがゼロになります。

スペキュラー マテリアルの色を変更すると、再度変更するまでその新しい値が維持されます。スペキュラー ライティングを「オフ」にしたい場合は、スペキュラー マテリアル カラーをゼロにリセットする必要があります。他の人も同じです。


3 つの照明モデルの設定と既定の設定を切り替えようとしています。したがって、実際にそれを行う必要があります。値を OpenGL のデフォルトにリセットする必要があります。それらは OpenGL 仕様にあります。

ただし、マテリアルの色に加えて、光の強度を設定する必要があります。

仕様を調べたくない場合は、デフォルトを次に示します。

  • 周囲光:(0.0, 0.0, 0.0, 1.0)
  • 周囲の物質:(0.2, 0.2, 0.2, 1.0)
  • ディフューズ ライト: (1.0, 1.0, 1.0, 1.0)(light0 のみ。他のすべてのライトのデフォルトは(0.0 0.0, 0.0, 1.0)
  • 拡散マテリアル:(0.8, 0.8, 0.8, 1.0)
  • specular light: (1.0, 1.0, 1.0, 1.0)(light0 のみ。他のすべてのライトのデフォルトは (0.0 0.0, 0.0, 1.0)
  • スペキュラ マテリアル:(0.0 0.0, 0.0, 1.0)
于 2012-04-16T20:36:40.497 に答える
0

まず、Light0 だけでなく、さまざまなライトを使用します。また、次のコマンドを使用して新しいライトをオンにする前に、すべてのライトをオフにしてみてください。

glDisable(GL_LIGHT0);

いくつかのヘルプ:光源 - OPENGL

于 2012-04-16T20:40:50.617 に答える