用于 OpenGL ES20 照明效果的顶点和片段着色器
Vertex and Fragment shaders for lighting effect in OpenGL ES20
我想通过着色器在我的模型中添加一个非常简单的光照效果。我发现有一个顶点和一个片段着色器可以在 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"
};
问题是我在 OpenGL ES2 中工作,因为我正在开发 Android 应用程序。而且似乎内置变量 gl_FrontLightModelProduct 不适用于 GLES20,因为我在这一行中遇到编译失败。
因此我的问题是:如何修改上述着色器以使其在 OpenGL ES20 上下文中工作?
gl_FrontLightModelProduct.sceneColor
给出场景的环境色,如果你想让不受光线影响的区域全黑,可以为 0。您可以将其替换为 vec4(0.0, 0.0, 0.0, 1.0);
您还应该删除这些变量并将它们作为制服发送。
gl_ModelViewMatrix
(统一发送)
gl_Vertex
(从属性中读取)
gl_NormalMatrix
(统一发送)
gl_Normal
(从属性中读取)
或者,您可以搜索 Simple OpenGL ES 2.0 着色器,而不是为转换 OpenGL 着色器而苦苦挣扎
我想通过着色器在我的模型中添加一个非常简单的光照效果。我发现有一个顶点和一个片段着色器可以在 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"
};
问题是我在 OpenGL ES2 中工作,因为我正在开发 Android 应用程序。而且似乎内置变量 gl_FrontLightModelProduct 不适用于 GLES20,因为我在这一行中遇到编译失败。
因此我的问题是:如何修改上述着色器以使其在 OpenGL ES20 上下文中工作?
gl_FrontLightModelProduct.sceneColor
给出场景的环境色,如果你想让不受光线影响的区域全黑,可以为 0。您可以将其替换为 vec4(0.0, 0.0, 0.0, 1.0);
您还应该删除这些变量并将它们作为制服发送。
gl_ModelViewMatrix
(统一发送)gl_Vertex
(从属性中读取)gl_NormalMatrix
(统一发送)gl_Normal
(从属性中读取)
或者,您可以搜索 Simple OpenGL ES 2.0 着色器,而不是为转换 OpenGL 着色器而苦苦挣扎