是否有可能以某种方式修改此片段着色器,以便它不使用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”
答案 0 :(得分:1)
“或者我完全忽略了这一点?” - 的确如此。着色器不关心底层纹理格式(你甚至不在你发布的那些着色器中使用任何纹理!),所以它们与你的问题无关。
应用程序代码在某处使用浮动纹理,需要相应地更改。但是你的着色器根本不使用任何纹理这一事实(而且我猜你还没有在其他地方明确创建浮动纹理),它可能是需要浮动纹理的three.js内部结构某处,也许是渲染目标。因此,如果可能,您需要搜索禁用此要求的方法。
答案 1 :(得分:0)
除非它是一个three.js主题,否则你没有在顶点着色器中定义projectionMatrix
,modelViewMatrix
和position
。
尝试添加
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
attribute vec4 position;
到第一个着色器的顶部?