【问题标题】:GLSL Fragment shader get Vertex PositionGLSL片段着色器获取顶点位置
【发布时间】:2014-01-20 11:40:35
【问题描述】:
<script id="shader-triangle-fs" type="x-shader/x-fragment">
  precision mediump float;

  uniform vec4 colorVec;
  uniform sampler2D uSampler;

  varying highp vec2 vTextureCoord;
  varying vec3 vVertexPosition;


  void main(void) {
    float dist = length(vVertexPosition.xy - gl_FragCoord.xy);
    float att = 100.0/dist;
    vec4 color = vec4(att,att,att, 1);
    vec4 texture = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
    gl_FragColor = color;
  }
</script>

<script id="shader-triangle-vs" type="x-shader/x-vertex">
  attribute vec3 aVertexPosition;
  attribute vec2 aTextureCoord;

  uniform mat4 uMVMatrix;
  uniform mat4 uPMatrix;

  varying highp vec2 vTextureCoord;
  varying vec3 vVertexPosition;

  void main(void) {
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
    vTextureCoord = aTextureCoord;
    vVertexPosition = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  }
</script>

float dist = length(vVertexPosition.xy - gl_FragCoord.xy);中,我想得到的是当前Vertex坐标到Fragment坐标的距离。

但我得到的总是这个。

http://puu.sh/6rbva.jpg
http://puu.sh/6rbzM.jpg

(我用的是triangleStrip。)

这些图片显示vVertexPosition.xy - gl_FragCoord.xy = 0 所以vVertexPosition.xy == gl_FragCoord.xy

为什么会发生这种情况?
以及如何获取当前 Vertex Position 到当前 FragCoord 的距离?

【问题讨论】:

    标签: glsl


    【解决方案1】:

    您将vVertexPosition 声明为varying,因此它在三角形的三个顶点之间进行插值。由于在每个顶点为它设置的值是顶点位置,因此它最终将与片段位置相同。

    问题是,你想要什么?您说您想要“与当前顶点位置的距离”,但这没有任何意义,因为片段着色器中没有单个“当前”顶点 - 有多个顶点定义包含片段的图元。

    对于更高版本的 OGL/GLSL,您可以将其定义为 flat varying(或只是 flat,具体取决于版本),在这种情况下,它将是激发顶点的位置。

    【讨论】:

    • 谢谢。但是当使用flat varying vec3 vVertexPosition; 时,我得到一个错误“非法使用保留字”。我正在使用 WebGL,glsl 版本是 100
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多