2016-04-19 5 views
0

私は黄色と茶色のキューブをレンダリングするために、Cでいくつかのソフトウェアを書いています。しかし、いったんライトをプログラムすると、すべての色がライトブルーに変わります。誰かが色が変わった理由を私に説明できますか?そして私はそのような極端な変化をどうやって防ぐことができますか?openGL - 稲妻による色の変化の理解

これは私が光のために使用されるコードです:あなたは即時モードを使用しているという事実に基づいて

GLfloat color1 = {0.633, 0.237, 0.170}; \\ changed to blue 

void initLight() 
{ 

    GLfloat red[] = {1.0,0.0,0.0,1.0}; 
    GLfloat white[] = {1.0,1.0,1.0,1.0}; 
    GLfloat blueGreen[]  = {0.0,0.4,1.0,1.0}; 

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, white); 
    glLightfv(GL_LIGHT0,GL_AMBIENT,white); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,blueGreen); 
    glMaterialf(GL_FRONT,GL_SHININESS,127.0); 
    glEnable(GL_LIGHT0); 

} 

答えて

1

、私はあなたが頂点を設定し、このようなものを書いていると仮定しますか?

glBegin(GL_TRIANGLES); 
glVertex3f(/*...*/); 
glColor3f(/*...*/); 
/*...*/ 
glEnd(); 

あなたがシーンに照明を追加すると、レンダラーはもはや個々の頂点のために提案カラー値を考慮し、その代わりに(光が青みがかっ緑色もの顔をオンさせる)を白色又は灰色に代入します。これを修正するには、レンダラーに頂点カラーをマテリアルカラーとして扱わせる必要があります。このコードは十分なものでなければならない:それはこのような問題を引き起こすよう

glEnable(GL_COLOR_MATERIAL); 

これは、もちろん、その理由なぜあなたは本当に、本当には、OpenGLのの即時モードまたは固定機能パイプラインのレンダリングを使用すべきではないです。最新のOpenGLを学ぶチュートリアルhereをお勧めします。

編集:固定誤植

DOUBLE EDITのCOMBO:

さてさて、あなたが考慮に入れる必要がありますいくつか他のものがあります。あなたはそれを超えて

GLfloat lp0[] = {4.0,4.0,3.0,1.0}; 

にそれを変更することがあり

一般
GLfloat lp0[] = {4.0,4.0,3.0,0.0}; 

いえば、位置ベクトルは、そのw部品を1に設定し(最後の)ではなく、0を持っている必要があり、あなたがしたいですよ特にマトリックス調整のようなものを使って、その位置で遊んでみてください。再び;これはFFPを使用しないもう一つの理由です。この場合は、光がオブジェクトに対してどの位置にあるのかを知ることが難しいためです。ワールド空間の<4,4,3>に置くことは、その位置がモデルビューと投影行列によって正しく変換されていることがわかっていれば、少なくとも私が見ているコードではそうではないように見えるだけです。

+0

はい私はglVertex()とglColorを使用します。 私は非常に古いスタイルのOpenGLを使用しています。エラー: 'GL_MATERIAL_COLOR'は宣言されていません。 回避策はありますか? –

+0

@ J.Doeコードスニペットに誤字がありました。それは 'GL_MATERIAL_COLOR'ではなく、' GL_COLOR_MATERIAL'とされています。実際問題を解決したのは – Xirema

+0

です。しかし、私はもはや光の影響は見ません。私は私の出発点に戻っています、私は何の光も使わなかったようです... –

1

直後:

glEnable(GL_COLOR_MATERIAL); 

あなたはおそらくも呼び出す必要があります:

glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

また、あなたの周囲の光は非常に明るいです。地色の拡散光から適切な効果を得るには、環境光の強度をいくらか下げる必要があるかもしれません。

関連する問題