Как вы применяете источники света, используя OpenGL ES 2.0? - PullRequest
2 голосов
/ 29 февраля 2012

Я пытаюсь найти учебник или пример кода, который объясняет и показывает использование источников света в OpenGL ES 2.0.Большая часть материалов, которые я видел в Интернете, относится к Opengl ES 1.1.

Кто-нибудь может предоставить какие-либо ссылки или документацию о том, как сделать освещение в OpenGL ES 2.0?

1 Ответ

11 голосов
/ 01 марта 2012

Сложность OpenGL ES 2.0 заключается в том, что, поскольку вы можете писать свои собственные шейдеры практически так, как вам хочется, не существует единого способа обеспечить освещение объекта.Это будет зависеть от того, как вы хотите представить свой контент.

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

Здесь используется вершинный шейдер:

attribute vec4 position;
attribute vec4 normal;

varying float lightIntensity;

uniform mat4 modelViewProjMatrix;
uniform vec3 lightDirection;

void main()
{
    vec4 newNormal = modelViewProjMatrix * normal;
    vec4 newPosition = modelViewProjMatrix * position;
    gl_Position = newPosition;

    lightIntensity = max(0.0, dot(newNormal.xyz, lightDirection));
}

с соответствующим фрагментным шейдером:

varying highp float lightIntensity;

void main()
{
    lowp vec4 yellow = vec4(1.0, 1.0, 0.0, 1.0);
    gl_FragColor = vec4((yellow * lightIntensity * 0.2).rgb, 1.0);
}

Точечное произведение направления света и нормали в этой вершине используется для вычисления интенсивности света, попадающего в глаз зрителя из этой вершины.Затем эта интенсивность света интерполируется между вершинами в каждом треугольнике, чтобы дать вам интенсивность в каждом фрагменте.

Я делаю более продвинутое пиксельное освещение в моем приложении с открытым исходным кодом Молекулы , гдекаждая сфера и цилиндр - это самозванец с трассировкой лучей, находящийся внутри прямоугольника.Для каждого пикселя я вычисляю вклад зеркального и окружающего освещения в этой точке на виртуальном объекте, а затем комбинирую его с коэффициентом окклюзии окружающей среды, рассчитанным при загрузке модели.Это далеко не то, что вы можете сделать с освещением, но вы можете покопаться в коде или прочитать мою небольшую статью о том, как это работает.

...