2016-08-24 55 views
0

我想通过着色器在我的模型中添加一个非常简单的照明效果。我发现有一个顶点和片段着色,使基于OpenGL的工作:顶点和片段着色器在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

我得到了我想要的第一个建议,用vec4替代gl_FrontLightModelProduct.sceneColor(0.0,0.0,0.0,1.0)。那谢谢啦 !! 我没有删除gl_ModelViewMatrix和其他人。现在我好奇,为什么它工作? – user3417052

+0

我不确定它是如何被编译的,gl_ModelViewMatrix和其他在OpenGL ES 2.0中不可用。可能取决于实施。或者你正在声明和传递这些制服在你的代码中。 – codetiger

+0

也许是执行。从着色器中可以看到,它们不被声明为制服 – user3417052

相关问题