首先,您无法从已经使用 WebGL 上下文的画布获取 2D 上下文。这就是为什么你会得到ctx is null
error.
要获取像素颜色,您有两种选择。
1. 将 WebGL 画布图像传输到具有 2D 上下文的画布上。
为此,请创建一个新画布并将其大小设置为与 THREE.js 画布大小相同,并从中获取 2D 上下文。然后,您可以使用 2D 上下文将渲染的图像从 THREE.js 画布绘制到新画布上作为图像:
var img2D = new Image();
twoDeeCanvasImage.addEventListener("load", function () {
ctx2D.clearRect(0, 0, canvas2D.width, canvas2D.height);
ctx2D.drawImage(img2D, 0, 0);
// from here, get your pixel data
});
img2D.src = renderer.domElement.toDataURL("img/png");
从那里你可以使用getImageData
,就像你之前做的那样。
此方法的一个警告是,您可能会看到由于通过导出图像时引入的压缩而导致图像质量下降toDataURL
。在某些情况下你可以绕过这个:
if(ctx2D.imageSmoothingEnabled !== undefined){
ctx2D.imageSmoothingEnabled = false;
}
else if(ctx2D.mozImageSmoothingEnabled !== undefined){
ctx2D.mozImageSmoothingEnabled = false;
}
else if(ctx2D.webkitImageSmoothingEnabled !== undefined){
ctx2D.webkitImageSmoothingEnabled = false;
}
else{
console.warn("Browser does not support disabling canvas antialiasing. Results image may be blurry.");
}
2.您还可以直接从渲染器获取像素值,但这会花费您额外的渲染通道。
请参阅此 THREE.js 示例:https://trijs.org/examples/?q=instanc#webgl_interactive_instances_gpu https://threejs.org/examples/?q=instanc#webgl_interactive_instances_gpu
本示例使用readRenderTargetPixels
in the THREE.WebGLRenderer
. https://trijs.org/docs/#api/renderers/WebGLRenderer https://threejs.org/docs/#api/renderers/WebGLRenderer
我没有任何使用此方法的个人经验,因此希望其他人可以填补一些空白。