0

Я хочу добавить очень простой световой эффект в свои модели с помощью шейдеров. Я нашел там вершину и фрагмент шейдеры, которые делают работу на 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?

+0

Вам придется избавиться от всех ссылок на предопределенные переменные состояния, которые были доступны в устаревших OpenGL. Это очень похоже на мой ответ здесь: http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-gl-position. Хотя речь шла о переходе к основному профилю рабочего стола, то, что вам нужно сделать для OpenGL ES, очень похоже. –

+0

Очень поучительный ответ. Благодаря !! – user3417052

ответ

1

gl_FrontLightModelProduct.sceneColor дает окружающий цвет сцены, который может быть 0, если вы хотите, чтобы область, на которую не влияет свет, была полностью черной. Вы можете заменить его на vec4(0.0, 0.0, 0.0, 1.0);

Вы также должны удалить эти переменные и отправить их в виде униформы.

  1. gl_ModelViewMatrix (отправить в форме)
  2. gl_Vertex (читать это из атрибутов)
  3. gl_NormalMatrix (отправить в форме)
  4. gl_Normal (читать это из атрибутов)

Или вместо во время конвертации шейдеров OpenGL вы можете искать простые шейдеры OpenGL ES 2.0

+0

Я получил именно то, что хотел только с вашего первого предложения, заменив gl_FrontLightModelProduct.sceneColor на vec4 (0.0, 0.0, 0.0, 1.0). Так что спасибо !! Мне не нужно было удалять gl_ModelViewMatrix и другие. Теперь мне любопытно, почему это сработало? – user3417052

+0

Не уверен, как он скомпилирован, gl_ModelViewMatrix и другие недоступны в OpenGL ES 2.0. Наверное, это зависит от реализации. ИЛИ вы где-то декламируете и передаете эти униформы. – codetiger

+0

Возможно, это реализация. Как вы можете видеть из шейдеров, они не объявляются как униформы – user3417052

Смежные вопросы