Почему эти прямоугольники opengl не выглядят одинаково? - PullRequest
2 голосов
/ 20 января 2020

Я борюсь с освещением 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);

lighting problem

1 Ответ

1 голос
/ 20 января 2020

В модели Legacy OpenGL используется Gouraud Shading . Свет рассчитывается для вершин и интерполируется на фрагменты, которые покрыты полигонами.
Зеркальный свет зависит от местоположения или направления источника света, вектора нормали поверхности и направления обзора. Поскольку направление обзора отличается для каждой вершины, освещение поверхностей отличается.
По сравнению с зеркальным светом рассеянный свет не зависит от направления обзора. Это зависит от местоположения или направления источника света и нормального вектора поверхности. Если векторы нормалей поверхностей равны, а источником света является направленный свет, то свет будет одинаковым на всех поверхностях.

Установите зеркальный свет 0:

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

и убедитесь, что источником света является направленный источник света (4-й компонент LightDef.LightPosToArray должен быть равен 0).

Другим вариантом может быть тесселяция больших поверхностей таким образом, чтобы доля вершин совпадала с меньшие. Например:

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

См. также GLSL-фиксированная замена фрагмента функции программы

...