首页 > 代码库 > 着色器编程学习(一)——类波浪+生成法线

着色器编程学习(一)——类波浪+生成法线

图形着色器——理论与实践(第2版) 

这个书在一些翻译上比较坑,而且案例都是都不完整,更重要的是中文翻译版本竟然没有书的网站也就是说没有案例代码。

所以在此我说一下网址:http://cgeducation.org/ShadersBookSecond/Source/

Demo.glib

Ortho -1. 1. -1. 1 .. 1 1000.
Vertex demo.vert
Fragment demo.frag
Program Dome
Color 1. .5 0.

QuadXY -2. 5. 200 200

 

demo.vert


in vec4 aVertex;
in vec4 aColor;

varying float vLightIntensity;
varying vec3 vColor;
vec3 LIGHTPOS =vec3(0.,2.,0.);
vec3 ECpos;
void main(void)
{
vec4 thisPos=aVertex;
vColor=aColor.rgb;

float thisX=thisPos.x;
float thisY=thisPos.y;
vec2 thisXY=thisPos.xy;
thisPos.z=0.3*sin(dot(thisXY,thisXY));

//计算法线,求微分
vec3 xtangent=vec3(1.,0.,0.);
xtangent.z=2.*0.3*thisX*cos(dot(thisXY,thisXY));
vec3 ytangent=vec3(0.,1.,0.);
ytangent.z=2.*0.3*thisY*cos(dot(thisXY,thisXY));

vec3 thisNormal=normalize(cross(xtangent,ytangent));
vec3 ECpos=vec3(gl_ModelViewMatrix*thisPos);
vLightIntensity=dot(normalize(LIGHTPOS-ECpos),thisNormal);
vLightIntensity=0.3+abs(vLightIntensity); //环境光
vLightIntensity=clamp(vLightIntensity,0.0,1.0);
gl_Position=gl_ModelViewProjectionMatrix*thisPos;

}

 

demo.frag

 


in vec4 vColor;
in float vLightIntensity;

void
main(void)
{
gl_FragColor = vColor*vLightIntensity;
}

着色器编程学习(一)——类波浪+生成法线