什么是 shader ?

Shader 是一品种C语法的程序,用于隔离硬件相干局部的的代码。
不同的shader程序在应用时编译老本机硬件反对的程序。

shader 分两种:

  • 顶点渲染程序 vertex shader
  • 片断渲染程序 fragment shader

vertex shader 用于批改(平移,旋转,扭曲)顶点的地位: potision 和确定顶点的色彩
fragment shader 用于确定每个像素的色彩,应用照明,材质等等

编写 shader 程序

  • 编译 vertex shader,到ID
  • 编译 fragment shader,失去ID
  • 查看是否有编译谬误
  • 链接以上两个 shader 程序, 失去ID

    • 放弃这个ID
    • 渲染三角形时,应用这个ID
    • 不同的模型能够有不同的shader程序

举个例子

顶点渲染器 vertex shader:

in vec4 s_vPosition;void main () {  // 看,我不须要任何矩阵操作  // s_vPosition 的值须要在 -1.0 和 1.0 之间  gl_Position = s_vPosition;}
out vec4 s_vColor;void main() {   //不管三七二十一,像素都搞成红的!   fColor =  vec4 (1.0, 0.0, 0.0, 1.0);}

与C语言一样,main函数是必须的入口函数。双斜杆为正文。

编译渲染器

能够通过调用一些OpenGL函数来编译渲染器程序。

编译渲染器分三步: 创立id,绑定代码, 编译。

  • <GLuint> glCreateShader (<type>)

    • 创立一个渲染器ID, 具备 GLuint 类型
    • GLuint ID = glCreateShader(GL_VERTEX_SHADER);
  • glShaderSource (<id>, <count>, <src code>, <lengths>)

    • 绑定代码到渲染器程序
    • 产生在编译之前
  • glCompileShader (<id>)

    • 编译一局部渲染器程序

创立、链接、应用渲染器

下面只是搞了一个局部渲染器,残缺的程序须要再来四步:

  • <GLuint> glCreateProgram ()

    • 创立一个渲染器程序,返回ID, 整个程序生命周期须要放弃这个ID
  • glAttachShader (<prog id>, <shader id>)

    • 这个调用须要别离对顶点和片断渲染器搞两次
  • glLinkProgram (<prog id>)

    • 真正的链接渲染器程序
  • glUseProgram (<prog id>)

    • 须要画三角形的时候应用渲染器程序

好了,就这些。具体的例子能够看这篇文章.