Hello GLSL


参考:《The Book of Shaders》

Fragment Shader(片段着色器)

#ifdef GL_ES
precision mediump float;
#endif

uniform float u_time;

void main() {
 gl_FragColor = vec4(1.0,0.0,1.0,1.0);
}

Shaders 是一系列的指令,但是这些指令会对屏幕上的每个像素同时下达。

  • shader 语言 有一个 main 函数,会在最后返回颜色值。这点和 C 语言很像。

  • 最终的像素颜色取决于预设的全局变量 gl_FragColor。

  • 这个类 C 语言有内建的变量(像 gl_FragColor),函数和数据类型。

  • vec4 类型,可以推测这四个变元分别响应红,绿,蓝和透明度通道。

  • 所有的宏都以 # 开头。预编译会在编译前一刻发生,把所有的命令复制到 #defines 里,检查#ifdef 条件句是否已被定义, #ifndef 条件句是否没有被定义。

  • loat 类型在 shaders 中非常重要,所以精度非常重要。更低的精度会有更快的渲染速度,但是会以质量为代价。“低”(precision lowp float;),“高”(precision highp float;)。

  • GLSL 语言规范并不保证变量会被自动转换类别。

void main() {
    gl_FragColor = vec4(1,0,0,1);   // 出错
}

uniform

每个线程和其他线程之间不能有数据交换,但我们能从 CPU 给每个线程输入数据。因为显卡的架构,所有线程的输入值必须统一(uniform),而且必须设为只读。 输入值叫做 uniform (统一值),它们的数据类型通常为:float, vec2, vec3, vec4, mat2, mat3, mat4, sampler2D and samplerCube。

#ifdef GL_ES
precision mediump float;
#endif

uniform float u_time;

void main() {
 gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0);
}

gl_FragCoord

gl_FragCoord存储了活动线程正在处理的像素或屏幕碎片的坐标。 因为每个像素的坐标都不同,所以我们把它叫做 varying (变化值)


#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

void main() {
vec2 st = gl_FragCoord.xy/u_resolution;
gl_FragColor = vec4(st.x,st.y,0.0,1.0);
}

GLSL

GLSL 代表 openGL Shading Language,openGL 着色语言

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.13.0