1. 程式人生 > >GPU程式設計之GLSL(四)——片段著色器

GPU程式設計之GLSL(四)——片段著色器

本文列出三種片段著色器:

清除片段著色器

void main(void)

{

      gl_FragColor=vec4(0.0,0.0,0.0,0.0);

}

流經片段著色器

uniform sampler2D texture

 

void main(){

      vec4 color=texture2D(texture,gl_TexCoord[0].st);

      gl_FragColor=color;

}

這個片段著色器相當於具有紋理對映工能的流經著色器,因為如果不使用該著色器,OpenGL也會以相同的效果對映紋理

卷積著色器convolution.flag

#extenson GL_ARB_texture_rectangle : enable

 

uniform sampler2DRect texture;

uniform float fRadius;

float nWidth=3.0;

float nHeight=3.0;

 

void main(void)

{

      vec2 pos=gl_TexCoord[0].st;                       //獲取當前紋理元座標值

      vec4 fSum=vec4(0.0,0.0,0.0,0.0);                //鄰近元素取值之和

      vec4 fTotal=vec4(0.0,0.0,0.0,0.0);               //鄰近元素個數

      vec4 vec4result=vec4(0.0,0.0,0.0,0.0);        //覆蓋當前紋理元的輸出座標

 

      //鄰近元素求和。座標值加上0.5,以防計算誤差

      for(float ii=pos.x-fRadius;ii<pos.x+fRadius+0.5;ii+=1.0)

      {

            for(float ii=pos.x-fRadius;ii<pos.x+fRadius+0.5;ii+=1.0)

            {

                  if(ii>=0.0&&jj>=0.0&&ii<nWidth&&jj<nHeight) 

                  {

                        fSum+=texture2DRect(txture,vec2(ii,jj)) ;

                        fTotal+=vec4(1.0,1.0,1.0,1.0);

                 }

            }

       //求得鄰近元素的均值

       vec4Result=fSum/fTotal;

       //將結果寫入幀快取對應畫素

       gl_FragColor=vec4Result;

      }

}

參考文獻:

仇德元.《GPGPU程式設計技術——從GLSL、CDPU到OpenGL》[M].河北省三河市:機械工業出版社,2012年:323.