【问题标题】:WebGL interpolate with a reference color inside a triangleWebGL 在三角形内插入参考颜色
【发布时间】:2019-05-15 02:39:57
【问题描述】:

使用 regl,我正在尝试使用 WebGL 绘制一个三角形,我可以在其中定义三角形内部某个参考点的颜色,并让其他像素的颜色成为它们到该点的距离的函数。

到目前为止,它仅在此参考点是角点之一时才有效:

从角落渐变

这是使用以下 Vert 和 Frag 着色器完成的:

  vert: `
  precision mediump float;
  uniform float scale;
  attribute vec2 position;
  attribute vec3 color;
  varying vec3 fcolor;
  void main () {
    fcolor = color;
    gl_Position = vec4(scale * position, 0, 1);
  }
  `,

  frag: `
  precision mediump float;
  varying vec3 fcolor;
  void main () {
    gl_FragColor = vec4(sqrt(fcolor), 1);
  }
  `,

  attributes: {
    position: [
      [1, 0],
      [0, 1],
      [-1, -1]
    ],

    color: [
      [1, 0, 0],
      [0, 1, 0],
      [0, 0, 1]
    ]
  },

  uniforms: {
    scale: regl.prop('scale')
  }

这里的参考点是[1,0]、[0,1]和[-1,-1]。使用相同的三角形,我如何在 [0,0] 处放置另一个参考点,例如颜色为白色? (这将在三角形内产生一个白色的“岛”)

【问题讨论】:

    标签: glsl webgl shader regl


    【解决方案1】:

    你必须定义2个uniform变量一个用于参考点的坐标,一个用于参考点的颜色:

    uniforms: {
        scale: regl.prop('scale'),
        refPoint: [0, 0],
        refColor: [1, 1, 1]
    }
    

    通过varying 变量将顶点坐标从顶点着色器传递到片段着色器:

    precision mediump float;
    
    uniform float scale;
    
    attribute vec2 position;
    attribute vec3 color;
    
    varying vec2 fpos;
    varying vec3 fcolor;
    
    void main()
    {
        fpos        = position;
        fcolor      = color;
        gl_Position = vec4(scale * position, 0, 1);
    }
    

    通过distance计算片段着色器中从参考点到插值位置的距离:

    float dist = distance(refPoint, fpos);
    

    根据距离插入颜色,mix

    vec3 micColor = mix(refColor, fcolor, dist);
    

    片段着色器:

    precision mediump float;
    
    uniform vec2 refPoint;
    uniform vec3 refColor;
    
    varying vec2 fpos;
    varying vec3 fcolor;
    
    void main()
    {
        float dist    = distance(refPoint, fpos);
        vec3 micColor = mix(refColor, fcolor, dist);
        gl_FragColor  = vec4(sqrt(micColor), 1);
    }
    

    【讨论】:

    • 感谢您的回答!是否有任何理由在 Frag 着色器而不是 Vertex 着色器中计算插值(然后将其传递给 Frag)?
    • @Ren 是的,因为插值颜色取决于与片段关联的位置的距离。这个距离必须在片段着色器中计算。如果您要在顶点中计算此值,则每个顶点将计算 3 次。因此,例如,如果该点位于三角形的中心,则到 3 个角点的距离是相同的,并且片段上的插值将为每个片段给出相同的结果。
    • 非常感谢 :) 祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2013-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多