我想写一个GLSL着色器程序,为每个脸阴影。我的第一次尝试使用了flat插值限定符和激发顶点。我使用平面插值的两个法线和位置顶点属性,这给我希望的老式效果的固体油漆表面。
虽然渲染看起来是正确的,但着色器程序实际上并没有完成正确的工作:
是否可以将光照方程一次,应用于三角形的质心,然后用计算出的颜色值来表示整个原语?怎么做?
发布于 2013-11-28 02:09:41
使用输入为三角形,输出为三角形的几何图形着色器。将法线和位置从顶点着色器传递给它,自己计算质心(通过平均位置),并进行照明,将输出颜色作为输出变量传递给片段着色器,后者只是读取并写出它。
发布于 2013-11-28 04:53:26
另一种简单的方法是利用屏幕空间位置的导数来计算片段着色器中的(屏幕空间)表面法线。它的实现非常简单,甚至表现良好。
我编写了一个这里示例(需要一个具有WebGL功能的浏览器):
顶点:
attribute vec3 vertex;
uniform mat4 _mvProj;
uniform mat4 _mv;
varying vec3 fragVertexEc;
void main(void) {
gl_Position = _mvProj * vec4(vertex, 1.0);
fragVertexEc = (_mv * vec4(vertex, 1.0)).xyz;
}碎片:
#ifdef GL_ES
precision highp float;
#endif
#extension GL_OES_standard_derivatives : enable
varying vec3 fragVertexEc;
const vec3 lightPosEc = vec3(0,0,10);
const vec3 lightColor = vec3(1.0,1.0,1.0);
void main()
{
vec3 X = dFdx(fragVertexEc);
vec3 Y = dFdy(fragVertexEc);
vec3 normal=normalize(cross(X,Y));
vec3 lightDirection = normalize(lightPosEc - fragVertexEc);
float light = max(0.0, dot(lightDirection, normal));
gl_FragColor = vec4(normal, 1.0);
gl_FragColor = vec4(lightColor * light, 1.0);
}https://stackoverflow.com/questions/20255919
复制相似问题