首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在OpenGL ES中将浮动存储在纹理中

在OpenGL ES中将浮动存储在纹理中
EN

Stack Overflow用户
提问于 2014-04-16 20:27:35
回答 2查看 2K关注 0票数 0

在WebGL中,我试图创建一个纹理,每个纹理由4个浮动值组成。这里,我尝试创建一个简单的纹理,其中包含一个vec4

代码语言:javascript
运行
AI代码解释
复制
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
      );

我的目的是使用这样的取样器在着色器中对它进行采样:

代码语言:javascript
运行
AI代码解释
复制
uniform sampler2D data;
...
vec4 retrieved = texture2D(data, vec2(0.0, 0.0));

但是,我在gl.texImage2D期间遇到了一个错误

代码语言:javascript
运行
AI代码解释
复制
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。在这种情况下,我将如何完成我想要做的事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-17 19:26:16

解决我的问题其实很简单!我只需要打字

代码语言:javascript
运行
AI代码解释
复制
var float_texture_ext = gl.getExtension('OES_texture_float');

现在WebGL可以使用纹理浮动!

此MDN页面告诉我们为什么:

注意:在WebGL中,与其他GL不同,只有在显式请求的情况下,扩展才可用。

票数 1
EN

Stack Overflow用户

发布于 2014-04-16 22:34:46

可以从浮点数数组创建字节数组。每个浮动应该占用4个字节(32位浮点数)。可以使用无符号字节的标准RGBA格式将该数组放入纹理。这将创建一个纹理,其中每个纹理包含一个32位浮点数,这似乎正是你想要的。

唯一的问题是,当您从片段着色器中的纹理中检索浮动值时,浮动值被拆分为4个浮动值。所以你要找的很可能是"如何将vec4转换为单个浮点数“。

您应该注意到,您试图使用的内部格式是由32位浮点数组成的RGBA,因为您的纹理总是每个纹理32位,所以即使强制浮动到纹理中也会导致夹紧或精度损失。然后,即使纹理由4 RGBA 32位浮动组成,您的着色器也很可能在某个时候使用texture2D将它们视为texture2D

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23124597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档