編集: 照明の問題を解決するために glNormal3f() を使用するように言う人が何人かいますが、私は今それを調査して実装しましたが、何も変わりませんでした。
私は OpenGL に慣れていないので、何か間違っていると思いますが、Red Book の例をできる限り厳密に追跡しましたが、何が問題なのかわかりません。そして皆さんに聞いてください。
2 つの問題があります。1 つは、glFrustum を正しく使用していると確信しているにもかかわらず、正射投影シーンをレンダリングし、何らかの理由でカメラの前後にあるオブジェクトをレンダリングすることです。もう 1 つは、このライティングを正しく行っていると確信しているにもかかわらず (本の例に従っているため)、シーンを均一な色でシェーディングなどを使用してライティングしていないことです。これが私のコードです:
#include "GraphicsManager.h"
#include <GL/gl.h>
void GraphicsManager::initialize () {
fx = 0;
fy = 0;
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glDepthFunc (GL_LEQUAL);
glEnable (GL_DEPTH_TEST);
glViewport (0, 0, 800, 600);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
int GraphicsManager::draw (std::vector<float> buttoninfo) {
// changing light_position makes no difference
GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
int i, j, k;
fx += buttoninfo[0];
fy += buttoninfo[1];
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f (0.5, 0.5, 0.8);
glLoadIdentity ();
glLightfv (GL_LIGHT0, GL_POSITION, light_position);�
glRotatef (buttoninfo[3], 1.0, 0.0, 0.0);
glRotatef (buttoninfo[2], 0.0, 1.0, 0.0);
glTranslatef (-fx, 0, -fy);
for (i = 0; i < 5; i ++) {
for (j = 0; j < 5; j ++) {
for (k = 0; k < 5; k ++) {
glPushMatrix ();
glTranslatef (i, j, k);
glBegin (GL_TRIANGLE_FAN);
glVertex3f (0.0, 0.5, 0.0);
glVertex3f (-0.5, -0.5, -0.5);
glVertex3f (-0.5, -0.5, 0.5);
glVertex3f (0.5, -0.5, 0.5);
glVertex3f (0.5, -0.5, -0.5);
glVertex3f (-0.5, -0.5, -0.5);
glEnd ();
glPopMatrix ();
}
}
}
glFlush ();
return (int)buttoninfo[5];
}
何が問題なのかを理解するのを手伝ってもらえますか? 前もって感謝します。