乐趣区

关于opengl:OpenGL-shader-程序基础

什么是 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>)

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

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

退出移动版