学习shader第一步

学习shader第一步

很早就想学习shader了,当时看着那本《openGL超级宝典》的高级shader语言看了2遍,却被误导到了那些什么shaderObject,shaderProgramme的概念上,还一直在思考一个Programme和Object之间的关系。
诸如包含和被包含、一对多,还有在程序中何时准备,何时释放的问题(曾看过网上一个例子,在游戏循环中居然不断重新编译)。

因为被这些问题搞混了很久,所以觉得应该找本更详细的书看,于是就找了本《openGL shading language》英文版电子书,前面5章的内容仍然是那些渲染管线的老问题,因为害怕会漏点什么,都耐着性子看,业余时间看了10天左右,才看到第6章一个入门的例子,还有第七章解决了以前困扰着的问题。

接下来用了那个RenderMonkey明明白白地试验了第6章的那个例子,试验时又冒出了不少数学问题,例如:vs中的法线变换为什么不用gl_ModelViewMatrix去乘、矩阵的各种运算公式等等,哎,都怪大一时线性代数学的太烂。

以下是按照“橙宝书”第六章的砖块,这一章后面留给读者有关解决颜色锯齿的问题,弄了半天.....
另外,RenderMonkey添加中文注释时,有时候居然会出什么“type name expected at token "<undefined>"”,然后编译不通过,也弄了半天...
uniform vec3 f3LightPos;
const   float  specularContribution = 0.4 ;
const   float  diffuseContribution = 1.0 - specularContribution;

varying 
float  LightIntensity;
varying vec2  MCposition;

void  main( void )
{
   vec3 ecPosition 
= vec3(gl_ModelViewMatrix * gl_Vertex);//在眼坐标系中物体的坐标
   
   vec3 tnorm     
= normalize(gl_NormalMatrix * gl_Normal);//在眼坐标系中的法线
   
   vec3 lightEyePos
=vec3(vec4(f3LightPos,1.0));
   
   vec3 lightVec   
= normalize(lightEyePos - ecPosition);//灯光方向(跟着眼睛移动)
   
   vec3 reflectVec 
= reflect(-lightVec, tnorm);//反射方向
   vec3 viewVec    = normalize(-ecPosition);//眼睛的前方向
   float diffuse   = max(dot(lightVec, tnorm), 0.0);//光线和法线的乘积
   float spec      = 0.0;

    
if (diffuse > 0.0)
    
{
        spec 
= max(dot(reflectVec, viewVec), 0.0);//反射光 
        spec = pow(spec, 2.0);
    }


    LightIntensity 
= diffuseContribution * diffuse +specularContribution * spec;


    MCposition
=gl_Vertex.xy;


   gl_Position 
=gl_ProjectionMatrix*gl_ModelViewMatrix * gl_Vertex;// ftransform();
}

uniform vec4 BrickColor;
uniform vec4 EdgeColor;
uniform vec2 f2BrickSize;
uniform vec2 f2BrickInnerPerc;

varying vec2 MCposition;
varying 
float  LightIntensity;

void  main( void )
{
   vec4  color;
   vec2  position, useBrick;
   position
=MCposition*0.02/f2BrickSize;
   
//在贴图为参考比例
   if (fract(position.y * 0.5> 0.5)
      position.x 
+= 0.5;
      

   position 
= fract(position);//在贴图上
   
   
   
float smallX=(1.0-f2BrickInnerPerc.x)/2.0;
   
float bigX=1.0-smallX;
   
   
   
float smallY=(1.0-f2BrickInnerPerc.y)/2.0;
   
float bigY=1.0-smallY;

   
if(position.x>0.5)
      useBrick.x 
= 1.0-smoothstep(bigX-0.03, bigX+0.03,position.x);
   
else
   
{
   
//useBrick.x = step(position.x, f2BrickInnerPerc.x);
     useBrick.x = smoothstep(smallX-0.03, smallX+0.03,position.x);
      }

   
if (position.y>0.5)
      useBrick.y 
= 1.0-smoothstep(bigY-0.03, bigY+0.03,position.y);
   
else
   
{
   
//useBrick.y = step(position.y, f2BrickInnerPerc.y);
   useBrick.y = smoothstep(smallY-0.03, smallY+0.03,position.y);
   }


  
// useBrick.x = step(position.x, f2BrickInnerPerc.x);
  
// useBrick.y = step(position.y, f2BrickInnerPerc.y);

    color  
= mix(EdgeColor,BrickColor , useBrick.x * useBrick.y);

   
   color
=color*LightIntensity;
   
   gl_FragColor 
= vec4( color.rgb, 1.0 );
}

学习shader第一步_第1张图片


接下来学习的主要问题:

shader环境配置、语法等烦问题都解决了,也能看明白RenderMonkey自带的一些比较简单的例子的整体思路。

但是每个例子中的细节部分,每个具体步骤的计算,却不明白。因此现在是看懂例子的大概,但是要我重新写一个,或者指出例子中某个具体计算的作用,或者脑里想象例子中某个具体步骤产生的效果,肯定不会...

你可能感兴趣的:(学习shader第一步)