2014-01-20 103 views
3
<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);,我想要得到的是从当前顶点坐标到片段坐标的距离。GLSL片段着色器得到顶点位置

但总是我得到的是这个。

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

(I使用triangleStrip。)

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

为什么会发生这种事?
以及如何获得从当前顶点位置到当前FragCoord的距离?

回答

1

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

问题是,你想要什么?你说你想要“与当前顶点位置的距离”,但这没有意义,因为片段着色器中没有单个“当前”顶点 - 有多个顶点定义包含片段的基元。使用更高版本的OGL/GLSL,您可以将其定义为flat varying(或根据版本只是flat),在这种情况下,它将是激发顶点的位置。

+0

谢谢。但是当使用'flat vec3 vVertexPosition;'时,我得到一个错误“非法使用保留字”。我正在使用WebGL,glsl版本是100 – bmyu