关于gl_FragCoord的理解

关于gl_FragCoord的理解

概述

记录一下在使用gl_FragCoord的一些知识点
先上shader来看效果

let shader = {
    vs: `
      void main() {
        gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( position, 1.0 );
      }
        `,
    fs: `
      // 屏幕尺寸
	  uniform vec2 u_resolution;
      void main() {
        vec2 uv = gl_FragCoord.xy/u_resolution;
				gl_FragColor = vec4(uv.x, uv.y, 0.0, 1.0);
      }
        `,
    uniform: {
      u_resolution: {
        value: {
          x: renderer.domElement.width,
          y: renderer.domElement.height,
        }
      }
    }
  }

  let geometry = new THREE.BoxBufferGeometry(10, 10, 10);

  let material = new THREE.ShaderMaterial({
    vertexShader: shader.vs,
    fragmentShader: shader.fs,
    uniforms: shader.uniform,
    transparent: true
  })

  let mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh);

我们创建了一个shader材质和box,最后添加到了场景中,先看下效果
在这里插入图片描述

然后我们将box给放大,在来看一下会呈现什么颜色
在这里插入图片描述
可以看到,左下角呈现黑色,右下角呈现红色,左上角绿色,右上角黄色,那这个颜色是怎么计算出来的呢,我们可以看到在片元着色器的一句关键的代码:vec2 uv = gl_FragCoord.xy/u_resolution;
gl_FragCoord:表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个 vec4 类型的变量 (x, y, z, 1/w),其中 x, y 是当前片元的窗口坐标。
u_resolution:表示我们的屏幕尺寸;
由此我们可以推算出gl_FragCoord的下x,y分量是一定是小于u_resolution的x,y的,一定是在[0, 1]区间的一个值
这个时候我们又有了个疑问,为什么左下角会是黑色呢?
我们先来看一下gl_FragCoord的坐标系
在这里插入图片描述
现在我们来计算一下左下角的颜色值久可以知道为什么是黑色的了
左下角的坐标为(0, 0), 根据gl_FragCoord.xy/u_resolution得出
分别计算得出 x = 0 / 1920 y = 0 / 1080;
最后算出的颜色值为(0.0, 0.0, 0.0, 1.0) 此颜色值即为黑色
以此类推 右下角的为 x= 1920 / 1920; y = 0 / 1080;
最后得出的结果为(1.0, 0.0, 0.0, 1.0) ,此颜色值为红色
和我们的猜想完全正确。
此文结束,边尝试边学习,如有错误的地方请赐教,谢谢~

posted @ 2021-01-30 13:52  爱吃土豆丝嗯  阅读(84)  评论(0编辑  收藏  举报  来源