shaderSchool_8_ INTRODUCTION TO FRAGMENT SHADERS(片段着色器)

Fragments vs. pixels

一个片段代表了一个像素的某个部分的颜色。在最简单的情况下,片段与像素之间存在1:1的关系,但在进行抗锯齿处理时,这个比例可能会更高。片段着色器是在GPU上运行的程序,用于确定每个片段的颜色

Basics of writing fragment shaders

gl_FragData[0]通常在渲染到具有多个颜色附件的帧缓冲时使用

void main() {
  //Colors are represented by 4 vectors in RGBA order
  gl_FragData[0] = vec4(1, 0, 0, 1);
}

当你只有一个颜色附件时(通常是默认的帧缓冲),你可以直接使用gl_FragColor变量来指定输出到颜色附件的颜色,它实际上是gl_FragData[0]的别名

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

gl_FragCoord

每个片段着色器还会接收一个特殊的输入变量,gl_FragCoord。这是一个vec4类型的变量,返回片段在设备坐标系中的坐标信息。

  • gl_FragCoord.xy表示片段相对于缓冲区左上角的单位坐标。其中,y分量表示片段所在的行,x分量表示片段所在的列。
  • gl_FragCoord.z表示片段的深度值,单位为[0,1]之间的值,其中0表示最近的z值,而1表示最远的z值。
  • gl_FragCoord.w是片段在裁剪坐标系中的齐次坐标的倒数。
    简单来说,gl_FragCoord提供了关于片段在缓冲区中位置和深度的信息。通过使用这些值,你可以在片段着色器中执行各种计算和操作,例如基于位置的颜色插值、深度测试等。

作业

以(256.5,256.5)为圆心,画一个半径128的圆

precision highp float;

#define CIRCLE_COLOR    vec4(1.0, 0.4313, 0.3411, 1.0)
#define OUTSIDE_COLOR   vec4(0.3804, 0.7647, 1.0, 1.0)

void main() {

  //TODO: Replace this with a function that draws a circle at (256.5,256.5) with radius 128
  
  if(distance(gl_FragCoord.y < 256) {
    gl_FragColor = CIRCLE_COLOR;
  } else {
    gl_FragColor = OUTSIDE_COLOR;
  }
}

答案

precision highp float;

#define CIRCLE_COLOR    vec4(1.0, 0.4313, 0.3411, 1.0)
#define OUTSIDE_COLOR   vec4(0.3804, 0.7647, 1.0, 1.0)

void main() {

  //TODO: Replace this with a function that draws a circle at (256.5,256.5) with radius 128
  
  if(distance(gl_FragCoord.xy,vec2(256.5,256.5))<128.0) {
    gl_FragColor = CIRCLE_COLOR;
  } else {
    gl_FragColor = OUTSIDE_COLOR;
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容