在JavaScript中以编程方式为WebGL生成纹理

在JavaScript中以编程方式为WebGL生成纹理,javascript,opengl-es,textures,webgl,Javascript,Opengl Es,Textures,Webgl,我有以下代码以编程方式在C中为WebGL生成纹理。我需要在JavaScript中为WebGL做同样的事情 如何正确创建三维棋盘矩阵 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

我有以下代码以编程方式在C中为WebGL生成纹理。我需要在JavaScript中为WebGL做同样的事情

如何正确创建三维棋盘矩阵

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);
}
void CreateTextures(){
GLubyte棋盘[64][64][3];
int i,j,c;

对于(i=0;i您不创建多维数组,而是创建一个 如下所示的一维数组:

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
。这需要为每个像素增加一个字节 α分量:

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);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);