2014-01-20 2 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 шейдер Фрагмент получить Vertex Поместите

Но всегда я получаю это.

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

(я использовал triangleStrip.)

Эти изображения показывают vVertexPosition.xy - gl_FragCoord.xy = 0 так vVertexPosition.xy == gl_FragCoord.xy.

Почему это происходит?
И как получить расстояние от текущей позиции вершины до текущего FragCoord?

ответ

1

Вы объявляете vVertexPosition как varying, поэтому он интерполируется между тремя вершинами в треугольнике. Так как значения, установленные для каждой вершины, являются вершинной позицией, она, таким образом, окажется такой же, как и позиция фрагмента.

Вопрос в том, что вы хотите? Вы говорите, что хотите «расстояние от текущей позиции вершин», но это не имеет смысла, поскольку в фрагментарной шейдере нет единственной «текущей» вершины - существует множество вершин, которые определяют примитив, содержащий фрагмент.

С более поздними версиями OGL/GLSL вы можете определить его как flat varying (или просто flat в зависимости от версии), и в этом случае это будет позиция вызывающей вершины.

+0

Спасибо. Но при использовании 'flat variableing vec3 vVertexPosition;', я получаю сообщение об ошибке «Незаконное использование зарезервированного слова». Я использую WebGL, версия glsl - 100 – bmyu

Смежные вопросы