Я хочу добавить очень простой световой эффект в свои модели с помощью шейдеров. Я нашел там вершину и фрагмент шейдеры, которые делают работу на OpenGL:Vertex и фрагментарные шейдеры для эффекта освещения в OpenGL ES20
static const char* vertSource = {
"uniform vec3 lightPosition;\n"
"varying vec3 normal, eyeVec, lightDir;\n"
"void main()\n"
"{\n"
" vec4 vertexInEye = gl_ModelViewMatrix * gl_Vertex;\n"
" eyeVec = -vertexInEye.xyz;\n"
" lightDir = vec3(lightPosition - vertexInEye.xyz);\n"
" normal = gl_NormalMatrix * gl_Normal;\n"
" gl_Position = ftransform();\n"
"}\n"
};
static const char* fragSource = {
"uniform vec4 lightDiffuse;\n"
"uniform vec4 lightSpecular;\n"
"uniform float shininess;\n"
"varying vec3 normal, eyeVec, lightDir;\n"
"void main (void)\n"
"{\n"
" vec4 finalColor = gl_FrontLightModelProduct.sceneColor;\n"
" vec3 N = normalize(normal);\n"
" vec3 L = normalize(lightDir);\n"
" float lambert = dot(N,L);\n"
" if (lambert > 0.0)\n"
" {\n"
" finalColor += lightDiffuse * lambert;\n"
" vec3 E = normalize(eyeVec);\n"
" vec3 R = reflect(-L, N);\n"
" float specular = pow(max(dot(R, E), 0.0), shininess);\n"
" finalColor += lightSpecular * specular;\n"
" }\n"
" gl_FragColor = finalColor;\n"
"}\n"
};
Проблема заключается в том, что я работаю в OpenGL ES2, потому что я занимаюсь разработкой Android приложений. И похоже, что встроенная переменная gl_FrontLightModelProduct недоступна для GLES20, потому что в этой строке происходит сбой компиляции.
Мой вопрос заключается в следующем: как я могу изменить вышеупомянутые шейдеры, чтобы заставить их работать в контексте OpenGL ES20?
Вам придется избавиться от всех ссылок на предопределенные переменные состояния, которые были доступны в устаревших OpenGL. Это очень похоже на мой ответ здесь: http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-gl-position. Хотя речь шла о переходе к основному профилю рабочего стола, то, что вам нужно сделать для OpenGL ES, очень похоже. –
Очень поучительный ответ. Благодаря !! – user3417052