首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >WebGL iOS呈现为浮点纹理

WebGL iOS呈现为浮点纹理
EN

Stack Overflow用户
提问于 2015-03-03 00:50:21
回答 1查看 5.5K关注 0票数 9

我正在尝试将WebGL上的浮点纹理呈现到iOS Safari上(而不是在本地应用程序中)。我已经设法让iOS手动读取创建的浮点纹理(例如从JavaScript),但是当我创建浮点类型的框架缓冲区并使用GPU将其呈现到其中时,它不起作用。

我已经将问题隔离到代码中,代码呈现为浮点纹理,然后将其传递给另一个着色器以显示。下面是应用于多维数据集的结果:

渲染到纹理绘制一个绿色的方块,一半的纹理大小,然后应用到立方体的每一边。

这在桌面和iOS WebGL上都能很好地工作,只要绿色方块所呈现的纹理类型是标准的无符号字节类型。但是,将类型更改为浮点会导致iOS设备上的呈现纹理失败(同时继续在桌面浏览器上工作)。纹理是空的,好像没有任何东西呈现给它。

我在这里创建了一个示例项目来演示这个问题:https://github.com/felixpalmer/render-2-texture

使用THREE.Renderer.precision设置更改着色器的精度没有任何区别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-09 10:27:23

据我所知,没有任何iOS设备支持将其呈现为浮点纹理(大多数移动设备在3/2015的时间点上也不支持)

我对WebGL规范的理解是

OES_texture_float:允许您创建和读取32位浮点纹理,但呈现到浮点是设备依赖的。

OES_texture_float_linear:允许线性滤波浮点纹理。如果这不存在,而OES_texture_float存在,那么您只能对浮点纹理使用gl.NEAREST

OES_texture_half_floatOES_texture_half_float_linear是相同的,除了半浮动纹理。

在假设WebGL存在浮点纹理的情况下,查看是否可以呈现到浮点纹理的传统方法是创建框架缓冲区,将浮点纹理附加到它,然后调用gl.checkFramebufferStatus。如果它返回gl.FRAMEBUFFER_COMPLETE,那么您可以,如果不能,则不能。注意:不管下一段,这个方法都应该工作。

规范已经更新,所以您还可以检查WebGL扩展,以确定是否可以呈现为浮点纹理。扩展WEBGL_color_buffer_float应该告诉您可以呈现为浮点纹理。扩展EXT_color_buffer_half_float对于半浮动纹理是相同的。我知道没有浏览器真正显示这些扩展,但如果硬件支持这些扩展,它们支持浮点呈现。

例如,我2012年在Chrome 41上的Retina MBP报告

代码语言:javascript
运行
AI代码解释
复制
gl = document.createElement("canvas").getContext("webgl").getSupportedExtensions()
["ANGLE_instanced_arrays", 
 "EXT_blend_minmax", 
 "EXT_frag_depth",  
 "EXT_shader_texture_lod",  
 "EXT_sRGB",  
 "EXT_texture_filter_anisotropic",  
 "WEBKIT_EXT_texture_filter_anisotropic",  
 "OES_element_index_uint",  
 "OES_standard_derivatives",  
 "OES_texture_float",  
 "OES_texture_float_linear",  
 "OES_texture_half_float",  
 "OES_texture_half_float_linear",  
 "OES_vertex_array_object",  
 "WEBGL_compressed_texture_s3tc",  
 "WEBKIT_WEBGL_compressed_texture_s3tc",  
 "WEBGL_debug_renderer_info",  
 "WEBGL_debug_shaders",  
 "WEBGL_depth_texture",  
 "WEBKIT_WEBGL_depth_texture",  
 "WEBGL_lose_context",  
 "WEBKIT_WEBGL_lose_context"]

Firefox 36报告

代码语言:javascript
运行
AI代码解释
复制
gl = document.createElement("canvas").getContext("webgl").getSupportedExtensions().join("\n")
"ANGLE_instanced_arrays
EXT_blend_minmax
EXT_frag_depth
EXT_sRGB
EXT_texture_filter_anisotropic
OES_element_index_uint
OES_standard_derivatives
OES_texture_float
OES_texture_float_linear
OES_texture_half_float
OES_texture_half_float_linear
OES_vertex_array_object
WEBGL_compressed_texture_s3tc
WEBGL_depth_texture
WEBGL_draw_buffers
WEBGL_lose_context
MOZ_WEBGL_lose_context
MOZ_WEBGL_compressed_texture_s3tc
MOZ_WEBGL_depth_texture"

浏览器供应商正忙着实现WebGL 2.0,如果gl.checkFramebufferStatus方法有效,就不会有花费时间让其他扩展字符串出现的压力。

显然,有些iOS设备支持EXT_color_buffer_half_float,因此您可以尝试创建半浮动纹理,将其附加到框架缓冲区并检查其状态,然后查看是否有效。

这里有一个检查支持的示例。在我的iPadAir2和iPhone5s上运行它

代码语言:javascript
运行
AI代码解释
复制
can make floating point textures
can linear filter floating point textures
can make half floating point textures
can linear filter floating point textures
can **NOT** render to FLOAT texture
successfully rendered to HALF_FLOAT_OES texture

这正是我们所期望的。

代码语言:javascript
运行
AI代码解释
复制
"use strict";

function log(msg) {
  var div = document.createElement("div");
  div.appendChild(document.createTextNode(msg));
  document.body.appendChild(div);
}                  

function glEnum(gl, v) {
  for (var key in gl) {
    if (gl[key] === v) {
      return key;
    }
  }
  return "0x" + v.toString(16);
}

window.onload = function() {
  // Get A WebGL context
  var canvas = document.getElementById("c");
  var gl = canvas.getContext("webgl");
  if (!gl) {
    return;
  }
  
  
  function getExt(name, msg) {
    var ext = gl.getExtension(name);
    log((ext ? "can " : "can **NOT** ") + msg);
    return ext;
  }
  
  var testFloat = getExt("OES_texture_float", "make floating point textures");
  getExt("OES_texture_float_linear", "linear filter floating point textures");
  var testHalfFloat = getExt("OES_texture_half_float", "make half floating point textures");
  getExt("OES_texture_half_float_linear", "linear filter half floating point textures");
  
  gl.HALF_FLOAT_OES = 0x8D61;
  
  // setup GLSL program
  var program = webglUtils.createProgramFromScripts(gl, ["2d-vertex-shader", "2d-fragment-shader"]);
  gl.useProgram(program);

  // look up where the vertex data needs to go.
  var positionLocation = gl.getAttribLocation(program, "a_position"); 
  var colorLoc = gl.getUniformLocation(program, "u_color");

  // provide texture coordinates for the rectangle.
  var positionBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
     -1.0, -1.0,
      1.0, -1.0,
     -1.0,  1.0,
     -1.0,  1.0,
      1.0, -1.0,
      1.0,  1.0]), gl.STATIC_DRAW);
  gl.enableVertexAttribArray(positionLocation);
  gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
  
  var whiteTex = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, whiteTex);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, 
                new Uint8Array([255, 255, 255, 255]));
  
  function test(format) {
    var tex = gl.createTexture();
    gl.bindTexture(gl.TEXTURE_2D, tex);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, format, null);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    
    var fb = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
    var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    if (status !== gl.FRAMEBUFFER_COMPLETE) {
      log("can **NOT** render to " + glEnum(gl, format) + " texture");
      return;
    }
    
    // Draw the rectangle.
    gl.bindTexture(gl.TEXTURE_2D, whiteTex);
    gl.uniform4fv(colorLoc, [0, 10, 20, 1]);
    gl.drawArrays(gl.TRIANGLES, 0, 6);
    
    gl.bindTexture(gl.TEXTURE_2D, tex);
    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    
    
    gl.clearColor(1, 0, 0, 1);
    gl.clear(gl.COLOR_BUFFER_BIT);
    
    gl.uniform4fv(colorLoc, [0, 1/10, 1/20, 1]);
    gl.drawArrays(gl.TRIANGLES, 0, 6);
    
    var pixel = new Uint8Array(4);
    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
    
    if (pixel[0] !== 0 ||
        pixel[1] < 248 ||
        pixel[2] < 248 ||
        pixel[3] < 254) {
      log("FAIL!!!: Was not able to actually render to " + glEnum(gl, format) + " texture");
    } else {
      log("succesfully rendered to " + glEnum(gl, format) + " texture");
    }    
  }
  if (testFloat) {
    test(gl.FLOAT);
  }
  if (testHalfFloat) {
    test(gl.HALF_FLOAT_OES);
  }
}
代码语言:javascript
运行
AI代码解释
复制
canvas {
  border: 1px solid black;
}
代码语言:javascript
运行
AI代码解释
复制
<script src="//webglfundamentals.org/webgl/resources/webgl-utils.js"></script>
<canvas id="c" width="16" height="16"></canvas>  
<!-- vertex shader -->
<script id="2d-vertex-shader" type="x-shader/x-vertex">
attribute vec4 a_position;

void main() {
   gl_Position = a_position;
}
</script>
<!-- fragment shader -->
<script id="2d-fragment-shader" type="x-shader/x-fragment">
precision mediump float;
uniform vec4 u_color;
uniform sampler2D u_texture;

void main() {
   gl_FragColor = texture2D(u_texture, vec2(0.5, 0.5)) * u_color;
}
</script>

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

https://stackoverflow.com/questions/28827511

复制
相关文章
WebGL 纹理颜色原理
腾讯IVWEB团队
2017/11/09
2.7K0
WebGL 纹理颜色原理
WebGL压缩纹理实践
本文将讲述压缩纹理在实际项目中的使用的案例。最近的一个项目是这样的:项目由于涉及到的建筑物特别多,大概有近40栋的建筑,而每一栋建筑物,又有10层楼,每层楼里面又有很多的设备。这就导致我们需要使用到大量的贴图。在实际的项目过程中,我们的客户的电脑会经常遇到webgl崩溃的情况。这就需要我们想办法来减少该项目下贴图显存和内存的占用。
用户3158888
2022/09/28
2.1K0
WebGL压缩纹理实践
WebGL简易教程(十一):纹理
在之前的之前的教程《WebGL简易教程(九):综合实例:地形的绘制》中,绘制了一个带颜色的地形场景。地形的颜色是根据高程赋予的RGB值,通过不同的颜色来表示地形的起伏,这是表达地形渲染的一种方式。除此之外,还可以将拍摄得到的数字影像,贴到地形上面,得到更逼真的地形效果。这就要用到我们这一章的新知识——纹理了。
charlee44
2019/10/18
1.1K0
WebGL简易教程(十一):纹理
一起学 WebGL:纹理对象学习
纹理对象,是将像素(texels)以数组方式传给 GPU 的对象,常见场景是贴图,就是将图片的数据应用到 3D 物体上。
前端西瓜哥
2023/08/18
2860
一起学 WebGL:纹理对象学习
WebGL2系列之不可变纹理
在WebGL1中,纹理包括2D纹理和立方体纹理,在实际的使用中,如果纹理的图片是宽和高是2的幂,可以自动生成纹理的mipmap。 除此之外,还可以通过gl.texImage2D函数独立指定纹理的每个mipmap的级别。 因此,这会导致一个一般的编程人员不易觉察的问题,这涉及到显卡底层驱动。 简单来说,就是会导致驱动程序无法在绘图之前确定纹理是否完全指定,因此它必须检查每一个mip贴图级别或者子图像的格式是否相符、每一个级别的大小是否正确以及是否有足够的内存。这种绘图时检查可能代价很高,而使用不可变纹理可以避免这种情形。
用户3158888
2019/05/29
7810
OpenGL ES 2.0 (iOS)[06-1]:基础纹理
Texture 在 OpenGL 里面有很多种类,但在 ES 版本中就两种——Texture_2D + Texture_CubeMap;
半纸渊
2018/08/30
2.1K0
OpenGL ES 2.0 (iOS)[06-1]:基础纹理
【WebGL】一次drawcall中绘制多个不同纹理的图形
Demo: http://kenkozheng.github.io/WebGL/multi-texture-in-one-drawcall/index.html
用户1258909
2020/07/27
1.8K0
原 WebGL on iOS8 终于等到了
image.png WWDC2014刚结束,这次的大会是名符其实的开发者大会,更贴切的应该说的确是一次软件开发者的大会,对于OSX和iOS的更多功能特性让人兴奋,Swift新语言促成了如上图片 image.png 但我更感兴趣的是WebGL终于官方的在OSX和iOS上得到了支持,这篇《A first look at what iOS8 means for Phaser and Pixi.js》分享了在iOS下运行WebGL例子的图片: image.png 以后分享HT的移动终端例子终于有了iOS
HT_hightopo
2018/06/05
3570
WebGL2系列之引言
时光荏苒岁月如梭,不知不觉间,青丝变白发,哦不是,应该是WebGL已经发展到了2.0阶段:WebGL2,WebGL2相比WebGL增加了很多新的特性,这些新的特性能够帮助程序开发人员实现更多 更酷 更炫 更高性能的Web三维程序。本系列文章将会向读者展示WEBGL2开发与WebGL的区别和WEBGL2的一些重要的新特性进行介绍.
用户3158888
2019/05/29
9970
【愚公系列】2022年09月 微信小程序-WebGL纹理材质的使用
在现实中webgl的用途很多,比如医院运维网站,地铁运维网站,海绵城市,可以以三维网页形式展示出现实状态。
愚公搬代码
2022/09/28
9581
【愚公系列】2022年09月 微信小程序-WebGL纹理材质的使用
地图开发中WebGL着色器32位浮点数精度损失问题
Javascript API GL是基于WebGL技术打造的3D版地图API,3D化的视野更为自由,交互更加流畅。提供丰富的功能接口,包括点、线、面绘制,自定义图层、个性化样式及绘图、测距工具等,使开发者更加容易的实现产品构思。充分发挥GPU的并行计算能力,同时结合WebWorker多线程技术,大幅度提升了大数据量的渲染性能。最高支持百万级点、线、面绘制,同时可以保持高帧率运行。
腾讯位置服务
2020/05/26
1.7K0
iOS 14 egret H5游戏卡顿问题分析和部分解决办法
现象 总体而言,iOS 14 渲染性能变差,可以从以下几个测试看出。 测试1: 简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转。(博客园视频播放
用户1258909
2020/10/30
3.6K0
iOS 14 egret H5游戏卡顿问题分析和部分解决办法
WebGL 3D on iOS8 正式版
今天iOS8终于正式发布了,升级了手头设备后对我来说最重要的就是测试WebGL的3D是否真的能跑苹果的系统了,跑了多个HT for Web的3D例子都非常流畅,比Android刚支持WebGL时好太多了,基本还没发现什么问题,苹果做事还是值得肯定,要嘛不做,要做就做真正能用的WebGL。 以下是跑HT for Web的3D网络空间拓扑图在iphone5上的截图和视频操作效果,自然不如PC上流畅,但iOS8第一步就能让WebGL达到这样的效果和性能我已经很知足了,感谢苹果!http://v.youku.com
HT_hightopo
2018/07/09
2880
Shader-基础纹理-遮罩纹理
遮罩纹理(mask texture)控制光照的强度,获得更加细腻的效果,通过遮罩纹理控制光照。在制作地形材质的时候混合多张图片,遮罩纹理控制如何混合这些纹理。 通过采样得到的纹素值与某种表面属性相乘,来更加精准的控制模型表面的各种属性。 在代码中添加了BumpMap来进行凹凸纹理效果,通过SpecularMask实现控制高光的光照
祝你万事顺利
2019/05/28
1.2K0
Shader-基础纹理-渐变纹理
一种基于冷暖色调的着色技术,通过渐变纹理控制漫反射光照。核心部分来说用过使用halfLambert构建一个纹理坐标,用这个纹理坐标来对渐变纹理进行采样。
祝你万事顺利
2019/05/28
1.2K0
webgl 基础
WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 WebGL在电脑的GPU中运行,每对方法中一个叫顶点着色器, 另一个叫片断着色器,并且使用一种和C或C++类似的强类型的语言 GLSL。 每一对组合起来称作一个 program(着色程序)
ronixiao
2022/08/08
1.4K0
WebGL 入门-WebGL简介与3D图形学
什么是WebGL? WebGL是一项使用JavaScript实现3D绘图的技术,浏览器无需插件支持,Web开发者就能借助系统显卡(GPU)进行编写代码从而呈现3D场景和对象。 WebGL基于OpenGL ES 2.0,OpenGL ES 是 OpenGL 三维图形 API 的子集,针对手机、平板电脑和游戏主机等嵌入式设备而设计。浏览器内核通过对OpenGL API的封装,实现了通过JavaScript调用3D的能力。WebGL 内容作为 HTML5 中的Canvas标签的特殊上下文实现在浏览器中。 WebG
庞小明
2018/03/07
2.8K0
WebGL 入门-WebGL简介与3D图形学
WebGPU 入门:绘制一个三角形
今天我们来入门 WebGPU,来写一个图形版本的 Hello World,即绘制一个三角形。
前端西瓜哥
2023/09/24
4830
WebGPU 入门:绘制一个三角形
纹理压缩
本文介绍了纹理压缩的基本概念、原理、常用压缩方式、压缩工具及相关技术标准,旨在帮助读者了解纹理压缩的基本知识,从而更好地进行纹理压缩相关的实践。
MelonTeam
2018/01/04
1.6K0
纹理压缩
显存优化:纹理压缩功能介绍与使用说明
纹理是指物体表面的纹路样式和细腻程度等外观效果。在计算机图形学中,常用于描述三维模型表面图案的二维图形。
Layabox Charley
2020/10/22
3.7K0
显存优化:纹理压缩功能介绍与使用说明

相似问题

将WebGL呈现为浮点纹理

13

使用webgl2复制浮点纹理

30

无法在WebGL中将alpha通道呈现为纹理

14

WebGL2中浮点纹理的线性滤波

12

iOS WebGL纹理呈现中的缺陷

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档