2

z=0上から中央に拡散照明を配置して、2つの三角形を描画しています。それらの1つをz軸でスケーリングすると、照明が変わります。以来z=0、z軸でのスケーリングは効果がないと思っていたでしょう。

私は何が欠けていますか?


レンダリングコード

  // Set up the a light centered horizontally.
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  float light1Position[] = { 0.0f, 2.0f, 0.0f, 1.0f };
  float light1Diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  glLightfv(GL_LIGHT0, GL_POSITION, light1Position);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light1Diffuse);

  // Set up the material.
  float material1Diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  glMaterialfv(GL_FRONT, GL_DIFFUSE, material1Diffuse);

  // Transform such that we can draw in (-1, -1) to (1, 1) at z = 0.
  glTranslated(0, 0, -1);
  glScaled(2, 2, 1);

  // Draw two triangles, symmetric w.r.t. to the light and camera.
  glBegin(GL_TRIANGLES);
    glVertex3d(-1, -1,  0);
    glVertex3d( 0,  1,  0);
    glVertex3d(-1,  1,  0);
  glEnd();

  glScaled(1, 1, 5.0);  // This should be a no-op since 5 * 0 = 0.
                        // However, the following triangle is darker.
  glBegin(GL_TRIANGLES);
    glVertex3d( 1, -1,  0);
    glVertex3d( 1,  1,  0);
    glVertex3d( 0,  1,  0);
  glEnd();

レンダリング結果

スクリーンショット


これを再現するCocoaプロジェクトをgithubにアップロードしました。私はこれをObjective-CとC++の両方で試しました。

4

1 に答える 1

4

頂点の座標が Z 方向で 0 であっても、法線は必ずしもそうではありません。実際、デフォルトの法線は (0, 0, 1) です。これは、サンプル コードで法線を明示的に指定していないため有効です。

glScaleしたがって、問題は、行列によって法線が正規化されていない長さにスケーリングされていることです。

于 2012-12-30T07:21:45.733 に答える