如何检测iOS8_beta4 webgl vertex shander sampler2d上的bug

时间:2014-07-27 09:23:16

标签: webgl detection vertex-shader

在ios beta 4,ipad2上,我做了一些检查,看看该设备是否支持gpu粒子模拟..

gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS) >= 1
!!gl.getExtension( 'OES_texture_float' )

他们都说是,但事情并没有真正起作用......

我想知道如何检测这种bug ... 所以我可以回到其他事情来展示......

webgl预览和src: https://googledrive.com/host/0B2CX8zXCqhScelpNMkpSX1pmRHM

截图: https://drive.google.com/folderview?id=0B2CX8zXCqhScR0d2SExtZm9EWDA


我用它来检测iOS 8 beta4之前...... 有没有更好的方法来检测和回退?

    if (
        navigator.userAgent.match(/(iPod|iPhone|iPad)/)
    ){
        var usrA= navigator.userAgent;
        var info = usrA.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
        if (parseFloat(info[2],10) <= 9537){
            check.gpuSim = false;
        }
    }

用于阅读此&gt; v&lt;〜

1 个答案:

答案 0 :(得分:0)

userAgent检查HTML / JavaScript is an anti-pattern中的任何内容。

他的案例的正确方法是检查是否可以渲染到浮点纹理(粒子模拟通常需要的东西)。要测试是否可以渲染到浮点纹理,您需要创建一个帧缓冲区,附加浮点纹理,然后检查它是否完整。

var gl = someCanvasElement.getContext("experimental-webgl");
var ext = gl.getExtension("OES_texture_float");
if (!ext) {
    alert("no OES_texture_float");
    return;
}

现在您可以使用浮点纹理创建和渲染。接下来要做的是看看你是否可以渲染到浮点纹理。

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(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) {
  alert("can not render to floating point textures");
  return;
}

此外,如果在渲染到浮点纹理时使用深度或模板附件,则需要在检查它是否完整之前附加它。