【发布时间】:2016-01-27 07:25:43
【问题描述】:
我正在使用 PNaCl ffmpeg 打开、读取和解码 RTSP 流。我现在有原始视频帧,我需要将其传输到 WebGl 以在画布上呈现。
如何在画布上呈现二进制数据?
我正在运行以下代码:我认为在运行此代码后我应该得到一个灰色画布,因为我将 (120,120,120,1) 的 RGBA 值传递给合成数据。
var canvas = document.getElementById('canvas');
var gl = initWebGL(canvas); //function initializes webgl
initViewport(gl, canvas); //initializes view port
console.log('viewport initialized');
var data = [];
for (var i = 0 ; i < 256; i++){
data.push(120,120,120,1.0);
}
console.log(data);
var pixels = new Uint8Array(data); // 16x16 RGBA image
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
gl.TEXTURE_2D, // target
0, // mip level
gl.RGBA, // internal format
16, 16, // width and height
0, // border
gl.RGBA, //format
gl.UNSIGNED_BYTE, // type
pixels // texture data
);
console.log('pixels');
console.log(pixels);
<canvas id="canvas"></canvas>
我应该在画布上显示一个灰色的 16x16 框,但我不明白。我需要采取哪些额外步骤才能在画布上正确渲染 2D 位图?
PS。我正在接受this article 的帮助。
【问题讨论】:
-
谢谢你,但由于我使用的是 RTSP 流,它不能在视频标签中播放,我使用 PNaCl ffmpeg 来获取流,所以从视频元素中获取数据将不工作。
-
你不应该做“gl.bufferData(gl.ARRAY_BUFFER, pixel);”对于纹理数据。纹理数据通过 teximage2d 传递。同时发布完整的代码,以及浏览器的控制台输出。
-
@prabindh 是的,我已经删除了 gl.bufferData(gl.ARRAY_BUFFER, pixel),输出保持不变。我已经在编辑中发布了完整的 javascript 代码(初始化 WegGl 和 initviewport 的 initWebGL 除外)。最后我还添加了控制台输出作为图像
-
您传递的 alpha 值为 1.0,但缓冲区是无符号的 8 位。 Alpha 将四舍五入为 1,你需要一些好眼睛才能看到。 Alpha 是一个 0 - 255 的 8 位值,您必须将其设置为高于 1 才能看到任何内容。
标签: javascript html canvas webgl binary-data