Opengl es OpenGL ES20中用于照明效果的顶点和片段着色器

Opengl es OpenGL ES20中用于照明效果的顶点和片段着色器,opengl-es,glsl,opengl-es-2.0,fragment-shader,vertex-shader,Opengl Es,Glsl,Opengl Es 2.0,Fragment Shader,Vertex Shader,我想通过着色器在模型中添加一个非常简单的照明效果。我发现有一个顶点和一个片段着色器可以在OpenGL上工作: static const char* vertSource = { "uniform vec3 lightPosition;\n" "varying vec3 normal, eyeVec, lightDir;\n" "void main()\n" "{\n" " vec4 vertexInEye = gl_ModelViewMatrix *

我想通过着色器在模型中添加一个非常简单的照明效果。我发现有一个顶点和一个片段着色器可以在OpenGL上工作:

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"
};
问题是我在OpenGLES2中工作,因为我正在开发一个Android应用程序。而且内置变量gl_FrontLightModelProduct似乎不适用于GLES20,因为我在这一行中编译失败


因此,我的问题是:如何修改上述着色器以使其在OpenGL ES20环境中工作?

gl\U FrontLightModelProduct.sceneColor
提供场景的环境颜色,如果希望不受光线影响的区域完全为黑色,则该颜色可以为0。你可以用
vec4(0.0,0.0,0.0,1.0)替换它

您还应该删除这些变量,并将它们作为统一格式发送

  • gl\U ModelViewMatrix
    (以统一格式发送)
  • gl\u顶点
    (从属性中读取)
  • gl_NormalMatrix
    (以统一格式发送)
  • gl_Normal
    (从属性中读取)

  • 或者,您可以搜索简单的OpenGL ES 2.0着色器,而不是转换OpenGL着色器。如果您希望不受灯光影响的区域完全为黑色,则sceneColor将为场景的环境颜色设置为0。你可以用
    vec4(0.0,0.0,0.0,1.0)替换它

    您还应该删除这些变量,并将它们作为统一格式发送

  • gl\U ModelViewMatrix
    (以统一格式发送)
  • gl\u顶点
    (从属性中读取)
  • gl_NormalMatrix
    (以统一格式发送)
  • gl_Normal
    (从属性中读取)

  • 或者,您可以搜索简单的OpenGL ES 2.0着色器,而不是在转换OpenGL着色器时进行斗争

    您将必须删除对传统OpenGL中可用的预定义状态变量的所有引用。这与我这里的答案非常相似:。虽然这是关于移动到桌面核心配置文件,但您需要为OpenGL ES执行的操作非常类似。您的回答非常有启发性。谢谢您必须去掉对遗留OpenGL中可用的预定义状态变量的所有引用。这与我这里的答案非常相似:。虽然这是关于移动到桌面核心配置文件,但您需要为OpenGL ES执行的操作非常类似。您的回答非常有启发性。谢谢我得到了你的第一个建议,用vec4(0.0,0.0,0.0,1.0)替换gl_FrontLightModelProduct.sceneColor,这正是我想要的。谢谢!!我不必删除gl_ModelViewMatrix和其他。现在我很好奇,为什么它能工作?我不确定它是如何编译的,gl_ModelViewMatrix和其他在OpenGL ES 2.0中是不可用的。这可能取决于实施情况。或者您在代码的某个地方声明并传递这些制服。可能是实现。正如您从着色器中所看到的,它们没有声明为uniformsI,这正是我在您的第一个建议中想要的,即用vec4(0.0,0.0,0.0,1.0)替换gl_FrontLightModelProduct.sceneColor。谢谢!!我不必删除gl_ModelViewMatrix和其他。现在我很好奇,为什么它能工作?我不确定它是如何编译的,gl_ModelViewMatrix和其他在OpenGL ES 2.0中是不可用的。这可能取决于实施情况。或者您在代码的某个地方声明并传递这些制服。可能是实现。从着色器中可以看到,它们未声明为制服