为什么这些 opengl 矩形看起来不一样?

Why does these opengl rectangles not look the same?

我正在为 OpenGL 照明而苦苦挣扎。我启用了以下功能:

Specular[0] = 1f;
Specular[1] = 1f;
Specular[2] = 1f;
Specular[3] = 1f;
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, new float[] { 70 });
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, Specular);

Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, LightDef.LightPosToArray);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, LightDef.AmbientToArray);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, LightDef.DiffuseToArray);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glShadeModel(Gl.GL_SMOOTH);

当我绘制彼此相邻且大小相同的矩形时,一切看起来都很好。当我以不同的尺寸绘制它们时,每一个的照明都会发生变化。我怎样才能使它们看起来无缝?

Gl.glNormal3f(0, 0, 1);
Gl.glRectf(0, 0, 1000, 500);
Gl.glRectf(0, 500, 500, 1000);
Gl.glRectf(500, 500, 700, 700);

Legacy OpenGLlight model uses Gouraud Shading。计算顶点的光并插值到被多边形覆盖的片段上。
镜面反射光取决于光源的位置或方向、表面的法向量和观察方向。由于每个顶点的观察方向不同,因此表面的照明也不同。
与镜面反射光相比,漫射光不依赖于观察方向。它取决于光源的位置或方向以及表面的法向量。如果表面的法向量相等且光源是定向光,则所有表面上的光都相同。

设置镜面光0:

Specular[0] = 0f;
Specular[1] = 0f;
Specular[2] = 0f;
Specular[3] = 0f;

并确保光源是定向光(LightDef.LightPosToArray 的第 4 个分量必须为 0)。

另一种选择是以这种方式细分较大的曲面,与较小的曲面共享顶点。例如:

+---+---+
|   |   |
+---+---+---+
|   |   |   |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+

另见 GLSL fixed function fragment program replacement