Three.js / GLSL - 将像素坐标转换为世界坐标

时间:2013-12-01 00:51:30

标签: three.js glsl webgl glsles

我的Three.js应用程序中有一个简单的着色器,它将屏幕变为红色。但是,我想将给定世界位置右侧的所有像素着色为不同的颜色。

我看到some answers建议使用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>

问:如何使用Three.js将像素的位置转换为WebGL中的世界位置?


1 个答案:

答案 0 :(得分:0)

来自WestLangley's Fiddle的答案:http://jsfiddle.net/ST4aM/2/


顶点着色器

<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>

片段着色器

<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>