0

是否可以以某种方式修改此片段着色器,使其不使用 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”

4

2 回答 2

1

“还是我完全没有抓住重点?” - 你确实是。着色器不关心底层纹理格式(您甚至不使用您发布的那些着色器中的任何纹理!),因此它们与您的问题没有任何关系。

它是在某处使用浮动纹理的应用程序代码,需要相应地进行更改。但是从你的着色器根本不使用任何纹理的事实来看(我猜你没有在其他地方明确创建浮动纹理),可能是三个.js 的内部需要在某个地方使用浮动纹理,也许作为渲染目标。因此,如果可能,您需要寻找禁用此要求的方法。

于 2012-07-09T13:12:26.013 回答
0

除非它是您尚未在顶点着色器中定义projectionMatrix,modelViewMatrix和的 three.js 主义。position

尝试添加

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

到第一个着色器的顶部?

于 2012-07-09T16:15:46.560 回答