我有以下代码来以编程方式为C中的WebGL生成纹理。我需要在JavaScript for WebGL中执行相同的操作。

如何正确创建3D棋盘格矩阵?

GLubyte checkerboard[64][64][3];


如何设置值?

checkerboard[i][j][0] = (GLubyte) c;


如何在WebGL中使用生成的纹理正确调用gl.texImage2D()

gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 64, 64, 0, gl.RGB, gl.UNSIGNED_INT, checkerboard);


这是C中的当前代码

void CreateTextures() {
    GLubyte checkerboard[64][64][3];
    int i, j, c;

    for (i=0; i<64; i++) {
        for (j=0; j<64; j++) {
            c = ((i & 8) ^ (j & 8))*255;
            checkerboard[i][j][0] = (GLubyte) c;
            checkerboard[i][j][1] = (GLubyte) c;
            checkerboard[i][j][2] = (GLubyte) c;
        }
    }

    glGenTextures( 1, &checkerboardTexture);
    glBindTexture(GL_TEXTURE_2D, checkerboardTexture);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_INT, checkerboard);
}


我认为结果函数在JavaScript中看起来像这样

function CreateTextures() {
    GLubyte checkerboard[64][64][3];
    int i, j, c;

    for (i=0; i<64; i++) {
        for (j=0; j<64; j++) {
            c = ((i & 8) ^ (j & 8))*255;
            checkerboard[i][j][0] = (GLubyte) c;
            checkerboard[i][j][1] = (GLubyte) c;
            checkerboard[i][j][2] = (GLubyte) c;
        }
    }

    var checkerboardTexture = gl.createTexture();
    gl.bindTexture( gl.TEXTURE_2D, checkerboardTexture);
    gl.texParameterf( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    gl.texParameterf( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 64, 64, 0, gl.RGB, gl.UNSIGNED_INT, checkerboard);
}

最佳答案

您没有创建多维数组,而是创建了一个
像这样的一维数组:

var checkerboard=[]


在纹理阵列中,每个像素将占据4个元素:红色,绿色,蓝色,
和Alpha(按此顺序)。这是一个如何填充每个像素的示例:

// Width is 64 pixels
checkerboard[(i*64+j)*4] = c; // Red component
checkerboard[(i*64+j)*4+1] = c; // Green component
checkerboard[(i*64+j)*4+2] = c; // Blue component
checkerboard[(i*64+j)*4+3] = 0xff; // Alpha component


接下来,将数组转换为字节数组:

checkerboard=new Uint8Array(checkerboard);


最后,生成纹理。
另请注意,通常您不能在WebGL中使用gl.RGB
而是gl.RGBA。每像素需要一个额外的字节
alpha组件:

gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA,
   64, 64, 0, gl.RGBA, gl.UNSIGNED_BYTE, checkerboard);


还有一件事:默认情况下,WebGL自上而下存储纹理,即
可能与OpenGL不同。自下而上使用
存储,在任何texImage2D之前添加以下命令
命令:

gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);

09-30 16:15
查看更多