无法初始化着色器VALIDATE_STATUS

时间:2012-07-09 12:58:37

标签: glsl webgl three.js

是否有可能以某种方式修改此片段着色器,以便它不使用oes_texture_float扩展名?因为我在应该运行webgl动画的机器上出错。

我使用three.js webglrenderer和一个应用了shadermaterial的多维数据集来设置我的场景。在我的macbook pro上,一切正常,但在某些Windows机器上我得到错误“不支持浮动纹理”(我搜索并发现这可能与oes_texture_float扩展有关)

所以我猜我需要更改片段着色器?或者我完全忽略了这一点?

<script type="x-shader/x-vertex" id="vertexshader">

    // switch on high precision floats
    #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 mediump float;
    #endif

    #define PI 3.14159265

    uniform float time;
    uniform vec2 resolution;

    float f(float x) {
        return (sin(x * 1.50 * PI ) + 19.0);
    }

    float q(vec2 p) {
        float s = (f(p.x + 0.85)) / 2.0; 

        float c = smoothstep(0.9, 1.20, 1.0 - abs(p.y - s));  
        return c; 
    }

    vec3 aurora(vec2 p, float time) {
        vec3 c1 = q( vec2(p.x, p.y / 0.051) + vec2(time / 3.0, -0.3)) * vec3(2.90, 0.50, 0.10);     
        vec3 c2 = q( vec2(p.x, p.y / 0.051) + vec2(time, -0.2)) * vec3(1.3, .6, 0.3);   
        vec3 c3 = q( vec2(p.x, p.y / 0.051) + vec2(time / 5.0, -0.5)) * vec3(1.7, 0.4, 0.20); 

        return c1+c2+c3; 
    }

    void main( void ) {
        vec2 p = ( gl_FragCoord.xy / resolution.xy );       
        vec3 c = aurora(p, time); 
        gl_FragColor = vec4(1.0-c, c);  
    }

</script>

编辑:这与浮点纹理无关,而是与我的片段着色器中的某些内容有关。 Three.js给出了错误:“无法初始化着色器,VALIDATE_STATUS”

2 个答案:

答案 0 :(得分:1)

“或者我完全忽略了这一点?” - 的确如此。着色器不关心底层纹理格式(你甚至不在你发布的那些着色器中使用任何纹理!),所以它们与你的问题无关。

应用程序代码在某处使用浮动纹理,需要相应地更改。但是你的着色器根本不使用任何纹理这一事实(而且我猜你还没有在其他地方明确创建浮动纹理),它可能是需要浮动纹理的three.js内部结构某处,也许是渲染目标。因此,如果可能,您需要搜索禁用此要求的方法。

答案 1 :(得分:0)

除非它是一个three.js主题,否则你没有在顶点着色器中定义projectionMatrixmodelViewMatrixposition

尝试添加

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
attribute vec4 position;

到第一个着色器的顶部?