2014-01-20 6 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/6rbzM.jpg

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

은 (내가 triangleStrip를 사용했습니다.)

이러한 이미지는 vVertexPosition.xy - gl_FragCoord.xy = 0 그래서 vVertexPosition.xy == gl_FragCoord.xy을 보여줍니다.

왜 이런 일이 발생합니까?
현재 Vertex Position에서 현재 FragCoord로 거리를 얻는 방법은 무엇입니까?

답변

1

vVertexPositionvarying으로 선언하여 삼각형의 세 정점 사이를 보간합니다. 각 정점에서 설정 한 값이 정점 위치이기 때문에 결국 조각 위치와 동일하게됩니다.

질문은 무엇입니까? '현재 버텍스 위치로부터의 거리'를 원한다고 말하지만, 프래그먼트 셰이더에는 "현재"버텍스가 하나도 없으므로 의미가 없습니다. 조각을 포함하는 프리미티브를 정의하는 여러 개의 버텍스가 있습니다.

이후 버전의 OGL/GLSL에서는 flat varying (또는 버전에 따라 flat)으로 정의 할 수 있습니다.이 경우 자극성 꼭지점의 위치가됩니다.

+0

감사합니다. 그러나 'flat varying vec3 vVertexPosition;'을 사용하면 "예약어를 잘못 사용했습니다"라는 오류 메시지가 나타납니다. WebGL을 사용하고 있습니다. glsl 버전은 100입니다. – bmyu

관련 문제