在WebGL中,我试图创建一个纹理,每个纹理由4个浮动值组成。这里,我尝试创建一个简单的纹理,其中包含一个vec4
。
var textureData = new Float32Array(4);
var texture = gl.createTexture();
gl.activeTexture( gl.TEXTURE0 );
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
// target, level, internal format, width, height
gl.TEXTURE_2D, 0, gl.RGBA, 1, 1,
// border, data format, data type, pixels
0, gl.RGBA, gl.FLOAT, textureData
);
我的目的是使用这样的取样器在着色器中对它进行采样:
uniform sampler2D data;
...
vec4 retrieved = texture2D(data, vec2(0.0, 0.0));
但是,我在gl.texImage2D
期间遇到了一个错误
WebGL: INVALID_ENUM: texImage2D: invalid texture type
WebGL error INVALID_ENUM in texImage2D(TEXTURE_2D, 0, RGBA, 1, 1, 0, RGBA, FLOAT,
[object Float32Array])
比较OpenGL ES规范和OpenGL 3.3规范 for texImage2D
,似乎不允许我使用gl.FLOAT
。在这种情况下,我将如何完成我想要做的事情?
发布于 2014-04-17 19:26:16
解决我的问题其实很简单!我只需要打字
var float_texture_ext = gl.getExtension('OES_texture_float');
现在WebGL可以使用纹理浮动!
此MDN页面告诉我们为什么:
注意:在WebGL中,与其他GL不同,只有在显式请求的情况下,扩展才可用。
发布于 2014-04-16 22:34:46
可以从浮点数数组创建字节数组。每个浮动应该占用4个字节(32位浮点数)。可以使用无符号字节的标准RGBA格式将该数组放入纹理。这将创建一个纹理,其中每个纹理包含一个32位浮点数,这似乎正是你想要的。
唯一的问题是,当您从片段着色器中的纹理中检索浮动值时,浮动值被拆分为4个浮动值。所以你要找的很可能是"如何将vec4转换为单个浮点数“。
您应该注意到,您试图使用的内部格式是由32位浮点数组成的RGBA,因为您的纹理总是每个纹理32位,所以即使强制浮动到纹理中也会导致夹紧或精度损失。然后,即使纹理由4 RGBA 32位浮动组成,您的着色器也很可能在某个时候使用texture2D
将它们视为texture2D
。
https://stackoverflow.com/questions/23124597
复制相似问题