shader的小奏鸣曲

shader的小奏鸣曲
第一个是最容易“发明”的车轮:x射线效果,不过按这个做法实现真正透明的话还要逐个物体渲染到纹理,再叠加:
shader的小奏鸣曲_第1张图片 shader的小奏鸣曲_第2张图片
 1 uniform vec3 LightPos;
 2 uniform  float  specularContribution;
 3
 4 varying vec3  normal;
 5 varying  float  LightIntensity;
 6 void  main( void )
 7 {
 8
 9   vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex);
10    normal      = normalize(gl_NormalMatrix * gl_Normal);
11    vec3 lightVec   = normalize(LightPos - ecPosition);
12    vec3 reflectVec = reflect(-lightVec, normal);
13    vec3 viewVec    = normalize(-ecPosition);
14
15    float spec      = clamp(dot(reflectVec, viewVec), 0.01.0);
16    spec            = pow(spec, 6.0);
17
18    LightIntensity  = (1.0-specularContribution) * max(dot(lightVec, normal), 0.0)
19                       + specularContribution * spec;
20
21   LightIntensity=max(LightIntensity,0.0);
22   gl_Position = ftransform();
23}
 1 uniform vec4 myColor;
 2 uniform vec4 InnerColor;
 3 uniform  float  RayTransmittance;
 4
 5 varying vec3  normal;
 6 varying  float  LightIntensity;
 7
 8 void  main( void )
 9 {
10   if(normal.z<=0.0)
11   normal.z=1.0;
12   float alpha=1.0-normal.z;
13   alpha=pow(alpha,RayTransmittance);
14   gl_FragColor =mix(myColor,InnerColor,alpha)+LightIntensity;//vec4( myColor.r, myColor.g, myColor.b, alpha );
15}

第二个是per pixel lighting,也简单,把vs中的东西搬到ps中就完了:
shader的小奏鸣曲_第3张图片 shader的小奏鸣曲_第4张图片
 1 uniform vec3 LightPos;
 2
 3 varying vec3 Normal_eyeSpace;
 4 varying vec3 Pos_eyeSpace;
 5
 6 void  main( void )
 7 {
 8   gl_Position = ftransform();
 9   
10   Normal_eyeSpace=gl_NormalMatrix * gl_Normal;
11   
12   Pos_eyeSpace=gl_ModelViewMatrix * gl_Vertex;
13   
14   
15}
 1 uniform vec3 LightPos;
 2
 3 varying vec3 Normal_eyeSpace;
 4 varying vec3 Pos_eyeSpace;
 5
 6 void  main( void )
 7 {
 8   Normal_eyeSpace=normalize(Normal_eyeSpace);
 9   vec3 LightDir_eyeSpace=normalize(Pos_eyeSpace-LightPos);
10   
11   float diffuse=max(dot(-LightDir_eyeSpace,Normal_eyeSpace),0.0);
12   float spec = 0.0;
13
14    if (diffuse > 0.0)
15    {
16        vec3 reflectVec = reflect(LightDir_eyeSpace, Normal_eyeSpace);
17        reflectVec=normalize(reflectVec);
18       
19        vec3 viewVec=normalize(-Pos_eyeSpace);
20        spec = max(dot(reflectVec, viewVec), 0.0);//反射光 
21        spec = pow(spec, 4.0);
22    }

23     float color=min(1.0,diffuse+spec);
24
25   gl_FragColor = vec4( color, spec, spec, 1.0 );
26}

第三个是normal mapping,比较难理解些,在vs中把点的空间位置弄清楚,然后ps中直接拿normal map的贴图当法线用。
但是看过别人实现的normal mapping是可以控制凹凸的强度的,这里好像控制不了,那位高手能说一说思路?
shader的小奏鸣曲_第5张图片
shader的小奏鸣曲_第6张图片
 1 uniform vec3 LightPosition;
 2
 3 varying vec3 EyePos_pointTanSpace;
 4 varying vec3 LightPos_pointTanSpace;
 5
 6 attribute vec3 Tangent;
 7 // uniform vec3 Tangent;
 8
 9 void  main()
10 {
11    gl_Position = ftransform();
12    gl_TexCoord[0= gl_MultiTexCoord0;
13    
14    
15    vec3 Pos_eyeSpace = vec3(gl_ModelViewMatrix * gl_Vertex);
16    
17    // 眼坐标系下的TBN
18    vec3 n = normalize(gl_NormalMatrix * gl_Normal);
19    vec3 t = normalize(gl_NormalMatrix * Tangent);
20    vec3 b = cross(n, t);
21    mat3 TBN = mat3(t, b, n);
22
23    vec3 pointLightPos=LightPosition-Pos_eyeSpace;//光相对于点,在眼空间的位置
24    LightPos_pointTanSpace=TBN*pointLightPos;//光相对于点,在点的tangent坐标系下的位置
25
26    
27    vec3 eyePos=Pos_eyeSpace*-1.0;       //眼睛相对于点,在眼空间的位置
28    EyePos_pointTanSpace=TBN*eyePos;//眼睛相对于点,在点的tangent坐标系下的点位置
29
30    
31}

 1 uniform sampler2D BumpTex;
 2
 3 uniform  float  bumpFactor;
 4
 5 varying vec3 EyePos_pointTanSpace;
 6 varying vec3 LightPos_pointTanSpace;
 7
 8 void  main() 
 9 {
10   float dist=length(LightPos_pointTanSpace);//光距离
11
12    vec3 BumpNorm = vec3(texture2D(BumpTex, gl_TexCoord[0].xy));//获得法向量
13    BumpNorm = (BumpNorm -0.5)* bumpFactor;
14    
15    
16    vec3 LightDir=normalize(LightPos_pointTanSpace);//光方向
17    vec3 viewVec=normalize(EyePos_pointTanSpace);//眼睛方向
18    
19    float diffuse = max(dot(BumpNorm, LightDir), 0.0);
20    
21    //diffuse=1.0/(pow(2.0,dist));//距离衰减
22    
23    vec3 reflectVec=reflect(-LightDir,BumpNorm);
24    
25    float spec = max(dot(reflectVec, viewVec), 0.0);//反射光 
26    spec = pow(spec, 16.0);
27
28    float color=spec+diffuse;
29    
30    gl_FragColor = vec4(color,spec,0.01.0);
31}

你可能感兴趣的:(shader的小奏鸣曲)