Плохая проблема с затенением в Android OpenGL ES - PullRequest
0 голосов
/ 18 февраля 2011

Я настроил рассеянное освещение:

private float[] lightAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
private float[] lightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
private float[] lightPosition = { 0.0f, 0.0f, 2.0f, 1.0f };

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);
gl.glEnable(GL10.GL_LIGHT0);

gl.glShadeModel(GL10.GL_SMOOTH);

Но я получаю триангулированную штриховку или плоский цвет на кубе, расположенном в начале координат (в центре) и повернутом на 45 градусов вокруг x и y. Таким образом, куб находится прямо перед светом. Какие-либо причины, почему я получаю такие плохие результаты? Прикрепленное изображение куба.

enter image description here

1 Ответ

0 голосов
/ 01 июня 2011

OpenGL ES рассчитывает цвета в вершинах каждого треугольника. Затем цвет интерполируется по всему треугольнику. В идеале вершины должны рассчитывать одинаковые цвета между двумя треугольниками, но в разных ситуациях это может не произойти.

Похоже, что края вашего куба моделируются двумя треугольниками. Вы можете разложить сторону куба на большее количество треугольников, но это увеличит объем памяти и может замедлить рисование.

Вы также можете перейти на OpenGL ES 2.0 и написать шейдер, который может правильно интерполировать цвета по всей поверхности, но для этого потребуется переписать весь конвейер. OGL ES не позволяет смешивать реализации в старом стиле и на основе шейдеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...