javascript - WebGL 从屏幕外画布正确读取像素
问题描述
我知道这方面有很多资源,但没有一个对我有用。
有些是:webgl readpixels 总是返回 0,0,0,0,
这个:https://stackoverflow.com/questions/44869599/readpixels-from-webgl-canvas\
以及这个:从一个WebGL 纹理
,但它们都没有帮助或成功。
目标:使用 WebGL 着色器渲染屏幕外画布,然后将其用作单独的 WebGL 着色器中的纹理。
笔记:
- 对于这些 WebGL 着色器,我使用了用于像素着色器的通用顶点着色器,特别是光线跟踪器/光线跟踪器。这是:
attribute vec2 a_position; void main() { gl_Position = vec4(a_position.xy, 0.0, 1.0); }
。这个顶点着色器输入了两个覆盖屏幕的三角形,所以基本上片段着色器正在做所有的工作。
问题:为了从屏幕外画布上获取图像数据,我尝试了以下方法:
- WebGL
gl.readPixels
函数
var capturedImageData = new Float32Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.FLOAT, capturedImageData);
- 使用另一个画布
getContext('2d')
var offscreenCanvas = document.createElement("canvas");
offscreenCanvas.width = screenWidth;
offscreenCanvas.height = screenHeight;
var ctx = offscreenCanvas.getContext('2d');
ctx.drawImage(glCanvas, 0, 0);
var capturedImageData = ctx.getImageData(0, 0, screenWidth, screenHeight);
这两种方法都会导致capturedImageData
数组被 填充
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, . . .
,这显然是不对的。
如果有人有此问题的经验,将不胜感激。谢谢!
该计划的直接链接是: https ://www.khanacademy.org/cs/-/6289631977619456
解决方案
您应该始终查看浏览器的 JavaScript 控制台(按 F12)或从菜单中选择它。我应该为您的代码显示错误
var capturedImageData = new Float32Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.FLOAT, capturedImageData);
const gl = document.createElement('canvas').getContext('webgl');
const screenWidth = 300;
const screenHeight = 150;
var capturedImageData = new Float32Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.FLOAT, capturedImageData);
当我运行您的代码时,我收到此错误
js:16 WebGL: INVALID_ENUM: readPixels: invalid type
你不能用FLOAT
. 看到这个答案
但是,您尝试执行的操作是渲染到一个纹理并将其用作另一个着色器的输入,这不应该使用 readPixels 来完成。应该使用允许您直接渲染到纹理的帧缓冲区来完成。
推荐阅读
- c# - 删除datagridview单元格点击事件
- firebase - 未处理的异常:错误:找不到正确的提供程序
在此 MyApp 小部件上方 - reactjs - 如何将状态中的数据从一个组件传递到不同文件夹中的另一个组件?
- tensorflow - 张量流中的自注意力和多输入模型
- apache-spark - 给定输入列无法解析“Column_Name”:错误:Pyspark Dataframes
- android - 从客户端android上传文件到服务器django
- python - print(sample_set.add('1232')) 输出为 None
- c# - 如何使用 ReactiveUI c# 异步验证 ViewModel 属性?
- javascript - 未捕获的类型错误:无法读取未定义的 highcharts-3d.src.js:306 的属性“animObject”
- google-apps-script - 整个项目中没有函数运行(Google App Script)