其他分享
首页 > 其他分享> > 解析顶点着色器和片元着色器

解析顶点着色器和片元着色器

作者:互联网

转载  https://www.jianshu.com/p/a771639ffbbb

 

管线

也称渲染管线,因为 OpenGL ES在渲染处理过程中会顺序执行一系列操作,这一系列相关的处理阶段就被称为OpenGL ES 渲染管线。OpenGL ES 渲染过程就如流水线作业一样,这样的实现极大地提高了渲染的效率。如图就是 OpenGL ES 的管线图,学习OpenGL ES 就是学习这张图中的每一个部分。


 

图中阴影部分的 Vertex Shader(顶点着色器)Fragment Shader(片元着色器)可编程管线 。可编程管线就是说这个操作可以动态编程而不必写死在代码中。可动态编程实现这一功能一般都是脚本提供的,在OpenGL ES 中也一样,编写这样脚本的能力是由着色语言GLSL提供的。那可编程管线有什么好处呢?方便我们动态修改渲染过程,而无需重写编译代码,当然也和很多脚本语言一样,调试起来不太方便。

Vertex Shader(顶点着色器)

 

1.可变变量(Varying):varying 变量用于存储顶点着色器的输出数据,也存储片元着色器的输入数据。varying 变量会在光栅化处理阶段被线性插值。顶点着色器如果声明了 varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的 varying 变量都应在片元着色器中重新声明为同名同类型的 varying 变量。

  1. gl_Position:在顶点着色器阶段至少应输出位置信息-即内建变量

  2. gl_FrontFacing:为back-face culling stage阶段生成的变量,无论精选是否被禁用,该变量都会生成。

  3. gl_PointSize:点大小。


// 位置属性
attribute vec4 position;
// 坐标属性
attribute vec2 textCoordinate; 
// 旋转角度
uniform mat4 rotateMatrix; 
// 输出变量
varying lowp vec2 varyTextCoord; 

// 着色器程序(Shader Program)
void main()
{
  // 赋值坐标属性到输出变量
  varyTextCoord = textCoordinate;
  // 位置乘以旋转矩阵
  vec4 vPos = position;
  vPos = vPos * rotateMatrix; 
  // 赋值位置到内建变量gl_Position上,作为输出信息(必须)
  gl_Position = vPos;
}

Fragment Shader(片元着色器)

 

片元着色器的作用是处理由光栅化阶段生成的每个片元,最终计算出每个像素的最终颜色。归根结底,实际上就是数据的集合。这个数据集合包含每一个像素的各个颜色分量和像素透明度的值。

// 纹理坐标
varying lowp vec2 varyTextCoord;
// 采样器
uniform sampler2D colorMp;

// 着色器程序(Shader program)
void main()
{
  // 读取纹素(纹理的颜色)放到输出变量gl_FragColor上
  gl_FragColor = texture2D(colorMap,varyTextCoord);
}

标签:变量,片元,varying,顶点,gl,着色器
来源: https://www.cnblogs.com/sdycxxl2010/p/12638983.html