2013-12-01 2 views
2

У меня есть простой шейдер в приложении Three.js, который окрашивает экран в красный цвет. Тем не менее, я хочу покрасить все пиксели справа от данной позиции мира до другого цвета.Three.js/GLSL - Преобразование пиксельной координаты в мировую координату

Я видел someanswers, что предлагают использовать varying vec4 worldCoord = gl_ModelViewMatrix * gl_Vertex;, но так как WebGL с помощью GLSLES, переменные, такие как gl_Vertex не доступны для меня.


вершинных шейдеров

<script type="x-shader/x-vertex" id="vertexshader"> 
    #ifdef GL_ES 
    precision highp float; 
    #endif 

    void main() 
    { 
     gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); 
    } 
</script> 

Фрагмент шейдер

<script type="x-shader/x-fragment" id="fragmentshader"> 
    #ifdef GL_ES 
    precision highp float; 
    #endif 

    float worldX = 10.0; //Or some other position in the WebGL world 

    void main() 
    { 
     if(gl_FragCoord.x > worldX) //FragCoord gives me coordinates relative to the screen 
     { 
      gl_FragColor = vec4(0.0, 1.0, 0.0, 1); 
     } 

     else 
     { 
      gl_FragColor = vec4(1.0, 0.0, 0.0, 1); 
     } 
    } 
</script> 

В: Как преобразовать положение пикселя в его мировое положение в WebGL, используя Three.js?


+1

Смотрите, если это поможет вам: http://stackoverflow.com/questi ons/19776554/three-js-a-vertex-shader-to-color-on-location-of-pixel-on-screen/19781424 # 19781424 – WestLangley

+0

@WestLangley: Ваша первая скрипка по вопросу ближе к тому, что я «Я хочу сделать. Я смог вывести решение из него. См. Мой ответ ниже. Благодаря! – Dragonseer

ответ

0

Ответ, полученный из Fiddle WestLangley здесь: http://jsfiddle.net/ST4aM/2/.


Vertex Shader

<script type="x-shader/x-vertex" id="vertexshader"> 
    #ifdef GL_ES 
    precision highp float; 
    #endif 

    varying float x; 
    varying float y; 
    void main() 
    { 
     gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); 
     x = position.x; 
     y = position.y; 
    } 
</script> 

Фрагмент Shader

<script type="x-shader/x-fragment" id="fragmentshader"> 
    #ifdef GL_ES 
    precision highp float; 
    #endif 

    varying float x; 
    varying float y; 

    void main() 
    { 
     if(x > somePosition) 
     { 
      gl_FragColor = vec4(0.0, 1.0, 0.0, 1); 
     } 

     else 
     { 
      gl_FragColor = vec4(1.0, 0.0, 0.0, 1); 
     } 
    } 
</script> 

+0

Это может быть ответ, который вы хотите, но это не ответ на заданный вами вопрос. – gman