私はOpenGLで少し3Dシーンをやろうとしていて、少し光り輝いています。私のシーンにはうまくいきますが(特別なものではありませんが)、イムは照明効果を加えようとしています。しかし、私は表彰台に素材を追加することができます(それはテクスチャではありません)、それは私に光を与え、テクスチャ加工されたものは何も材料に適用されないので、ライトを持つ点を無視します。コードの一部を引用します。openglで作業中
// Setup GL_LIGHT0
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); // Setup ambient light
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); // Setup diffuse light
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular); // Setup specular light
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qa);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT1
glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient); // Setup ambient light
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse); // Setup diffuse light
glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular); // Setup specular light
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, qa);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT2
glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient); // Setup ambient light
glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse); // Setup diffuse light
glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular); // Setup specular light
glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, qa);
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT3
glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient); // Setup ambient light
glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse); // Setup diffuse light
glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular); // Setup specular light
glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, qa);
glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 0.0);
// OpenGL provides a global ambient light component - we don't want this so set to zero
GLfloat global_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
私の部屋+ 3dオブジェクトをレンダリングする。
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
glEnable(GL_LIGHT3);
// Define position and direction
// NOTE: Placing these commands AFTER the above viewing (camera) transformations means the light position and direction appear to have a set point/direction in the 3D environment. If these commands are placed BEFORE the above viewing transformations, then the light appears to move with the camera (as if it is attached to the camera!)
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightDirection1);
glLightfv(GL_LIGHT1, GL_POSITION, lightPosition1);
glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, lightDirection2);
glLightfv(GL_LIGHT2, GL_POSITION, lightPosition2);
glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, lightDirection3);
glLightfv(GL_LIGHT3, GL_POSITION, lightPosition3);
// setup materials for objects to draw
glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
glMaterialfv(GL_FRONT, GL_SPECULAR, specularMaterial);
// 2. Draw scene
glPushMatrix();
drawRoom();
glTranslatef(0.0,-0.75,0.0);
glRotatef(90.0, 1.0,0.0, 0.0);
glRotatef(-spin, 0.0,0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
drawPodium();
glPopMatrix();
// Save transformations prior to rendering scene
glPushMatrix();
glColor3f(0.0, 0.0, 1.0);
// Setup texture state
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glRotatef(spin, 0.0,1.0, 0.0);
// Render model
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial2);
glTranslatef(0.0,0.8,0.0);
glRotatef(1.0,1.0,0.0,0.0);
myModel->renderTexturedModel();
// Reset texture state
glDisable(GL_TEXTURE_2D);
// restore transformations after rendering scene
glPopMatrix();
そして、すべて0.0に向けて見下ろすヘリコプター上記正方形の私の4ライトが付いている現在の結果は、次のとおりです。
あなたは彼らが白い点線を作ることができればライトが探している方向。表彰台の表面が照らされ、表彰台の側面が回転すると点灯します。しかし、部屋やヘリコプターの残りの部分は光に反応せず、照明のように動作しないので、なぜ私はそれが表彰台以外のすべてがテクスチャされていると思う理由を有効にします。
私はあなたの言ったことを見て、ラインを取り除きましたが、それはまだ同じです:( –
myModel-> renderTexturedModel();で何が起こるか? –
これはコメント付きの関数です。 「Tは、実際にハードコードを参照してください //テクスチャが接続されている場合、テクスチャモデルをレンダリングこれは、テクスチャ状態を想定して、セットアップ \t //これはglEnableです(GL_TEXTURE_2D)とglTexEnvf(GL_TEXTURE_ENV、GL_TEXTURE_ENV_MODE、)が含まれてきました;。。 \t無効renderTexturedModel( )const; –