WebGL - 从内存渲染缓冲区

时间:2013-11-15 12:49:09

标签: memory opengl-es cuda webgl

我是webgl的新手,是否可以从主机内存(RAM)中读取缓冲区并进行渲染? 或者也许从CUDA缓冲区读取缓冲区并渲染它。我可以在openGL中做第一个,但我想知道我是否可以在webGL中做到这一点

编辑:我想要更准确地做我想做的事情。

我有一个带有图像的RGBA缓冲区,可以使用glDrawPixels立即在GL上下文中渲染。这是由CUDA代码生成的(因此缓冲区最初位于gpu内存中)。有没有办法将其可视化为webGL窗口?

2 个答案:

答案 0 :(得分:4)

如果你的意思是“主机内存”的一些JavaScript缓冲区,那么是:你将它上传到一个WebGL缓冲区对象,然后用它做你想做的任何事情。 WebGL没有CUDA交互。而且你不能只为你的东西“抓住”任何其他进程的记忆。记忆保护是一件好事。

请更具体地说明你想做什么。

由于评论而更新。

你认为你可能有一个RGBA缓冲区,但你没有。其他一些进程有或有此缓冲区,但就WebGL而言,此缓冲区不存在。它是不同进程的一部分,内存(以及系统在那里的CPU和GPU内存之间没有区别)是(或至少应该)保护其免受其他进程的访问。

考虑一下:如果您的浏览器(通过WebGL)可以访问驻留在系统内存中不属于它的随机内容,这将极大地损害安全性。对于常规OpenGL,您实际上可以查看未初始化的内存部分以查看之前的内容。但对于WebGL来说,作为一种互联网技术,需要进行大量的检查,以至于无法到达沙箱之外。哎呀,甚至引入了新的扩展来使OpenGL对数据泄露和基于GPU的攻击媒介更加强大。

到目前为止,在WebGL中,不仅内存在进程之间受到保护,而且WebGL实例也可以在同一进程中运行。

答案 1 :(得分:1)

以下是http://omino.com/experiments/webgl/OmGl.js的摘录,它是“drawtexture”方法的一部分,它将JavaScript数组渲染到webgl画布上。

http://omino.com/experiments/webgl/manualTexture.html使用它的简单实例。 (它引用了OmGl.js中的一些助手;但希望足够清楚。)

希望有所帮助!

var _omglDrawTextureProgGl = null;
var _omglDrawTextureProg = null;
var _omglPosBuffer = null;

/* 
 * fill the current frame buffer with the texture.
 * Right up to the edges.
 * you can specify which texture unit, if you like.
 * reduce thrashing maybe.
 *
 * pass in your own
 */
OmGl.drawTexture = function drawTexture(gl,texture,textureUnit,prog)
{

if(!textureUnit)
    textureUnit = 0;
if(!prog)
{
    if(gl != _omglDrawTextureProgGl || !_omglDrawTextureProg)
    {
        var dtvs = "attribute vec2 pos;"
                 + "varying vec2 unitPos;"
                 + "void main() {"
                 + " unitPos = (pos.xy + 1.0) / 2.0;"
                 + " gl_Position = vec4(pos,0,1);"
                 + "}";
        var dtfs = "precision mediump float;"
                 + "uniform sampler2D uSampler;"
                 + "varying vec2 unitPos;"
                 + "void main() {"
                 + " gl_FragColor = texture2D(uSampler, unitPos);"
                 + "}";
        _omglDrawTextureProg = OmGl.linkShaderProgram(gl,dtvs,dtfs);
        _omglDrawTextureProgGl = gl;
    }
    prog = _omglDrawTextureProg;
}
gl.useProgram(prog);

// Two triangles which fill the entire canvas.
var posPoints = [
    -1,-1,
    1,-1,
    1,1,
    -1,-1,
    1,1,
    -1,1
];

gl.activeTexture(gl.TEXTURE0 + textureUnit);
gl.bindTexture(gl.TEXTURE_2D, texture);

var z = gl.getUniformLocation(prog, "uSampler");
gl.uniform1i(z, textureUnit);
_omglPosBuffer = OmGl.setAttributeFloats(gl, prog, "pos", 2, posPoints, _omglPosBuffer);
gl.clear(gl.DEPTH_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, posPoints.length / 2);
}

(编辑 - 将http://omino.com/experiments/webgl/manualTexture.html上的代码更新为更清洁。)