程序员

OpenGL中的着色语言

2017-02-09  本文已影响1338人  皮皮Warrior


glimpse

GLSL是专门用来OpenGL shader的语言,shader是可以直接在GPU上运行的小程序,一般以字符串的方式在代码中使用。shader分为vertex shader(顶点着色器)与fragment shader(片段着色器)两种,顶点shader在每个顶点执行一次,片段shader在每个像素执行一次,两者配合决定模型的渲染结果。

变量类型

GLSL中用来传递值的变量类型有三种:attributeuniformvarying

//get attribute slot position
_vertexPosition = glGetAttribLocation(_programHandle, "vertexPosition");
//feed attribute slot
glVertexAttribPointer(_vertexPosition, 3, GL_FLOAT, GL_FALSE, sizeof(float)*3, 0);
//get uniform slot position
GLint yuvType = glGetUniformLocation(_programHandle, "yuvType");
//feed uniform slot
glUniform1i(1, yuvType);

GLSL有一些特定的数据类型,如vec表示向量、mat表示矩阵、sample2D/sample3D表示纹理。
除此之外GLSL还拥有自己的内建变量,即以gl_开头的变量。可以看这里查阅

语法

GLSL的是基于C的一种语言,语法与其相同,每个shader都由main函数作为程序入口。不同的是shader都有自己的内建变量,使用它们shader可以与渲染管线通信。例如顶点shader的任务就是计算顶点的最终位置并赋值给gl_Position,片段shader计算每个像素的颜色并赋值给gl_FragColor

以下是一对简单的shader,顶点shader接受CPU传来的vertexPosition与pixelColor,再将pixelColor传递给片段shader,GPU根据它们的计算结果渲染结果。

vertex shader:

//attribute 关键字用来描述传入shader的变量
attribute vec4 vertexPosition; // 需要从外部获取的4分量vector
attribute vec4 pixelColor; 
//varying 关键字用来描述从vertex shader传递给fragment shader的变量
//精度修饰符分为三种:highp, mediump, lowp
varying mediump vec4 finalPixelColor; //mediumP修饰代表中等精度,提高效率。
 
void main(void) { 
    finalPixelColor = pixelColor; // 将pixelColor的值通过finalPixelColor传递给fragment shader
    gl_Position = vertexPosition; // gl_Position是vertex shader的内建变量,gl_Position中的顶点值最终输出到渲染管线中
}

fragment shader:

varying mediump vec4 finalPixelColor; 
 
void main(void) { 
    gl_FragColor = finalPixelColor; // gl_FragColor是fragment shader的内建变量,gl_FragColor中的像素值最终输出到渲染管线中
}

上一篇 下一篇

猜你喜欢

热点阅读