2015-11-06 193 views
0

基本上我有200×200像素画布,一个20×20×20像素的体素。所以我有100个体素。当我在画布上画画时,我想看看哪个像素被绘制,并且如果该像素位于体素的一个像素内,那么我将显示该体素。WebGL:INVALID_OPERATION:readPixels:ArrayBufferView尺寸不够大

voxelWidthPixel下面是体素宽度的像素数,voxelHeightPixel是体素高度的像素数。我使用一个循环,以便从(0,0)到(20,20),然后从(0,20)到(20,40)然后从(0,40)到(20,60)读取像素值,并最终到(180,160)到(200,180),然后是(180,180)到(200,200)。

for (var i =bottomleft.x, px =0 ; i < topRight.x; i = i + voxelSize, px = px + pixWidthVoxel){ 
    for (var j = bottomleft.y, py =0 ; j < topRight.y ; j = j + voxelSize, py = py + pixHeightVoxel){ 

     var pixelValues = new Uint8Array(voxelWidthPixel * voxelHeightPixel * 4); 
     gl.readPixels(startPixelX, startPixelY, endPixelX, endPixelY, gl.RGBA, gl.UNSIGNED_BYTE, pixelValues); 
    } 
} 

不应该pixelValues是arrayBuffer大小= 20 * 20 * 4 = 1600?由于我只是从(0,0)到(20,20)然后从(0,20)到(20,40)读数,从(0,0)到(20,20)的平方将保持400像素。不应该像素值足以获得所有RGBA值

+0

第三和替换这两个值readPixels第四参数是宽度和高度,你的变量endPixelX和endPixelY的名字会建议您所提供的读取错误的尺寸。这将解释错误,但没有更多信息,不可能确定这是否是问题。 – Blindman67

+0

@ Blindman67如果宽度和高度是帆布的?难道它不能像画布的一部分?我将画布分成20 X 20px的小部分,并给出这个小部分的bottomLeft和topRight坐标。 – spuemaacne

+0

这两个值应该是20和20,它应该是'endPixelX-startPixelX'和'endPixelY - startPixelY'我有这个文档,宽度和高度是需要的。 – Blindman67

回答

1

gl.readPixels的第三个和第四个参数是宽度和高度值。 endPixelXendPixelXendPixelX-startPixelXendPixelY - startPixelY