opengl:glgetteximage用于二维纹理和一维纹理数组

alen0pnh  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(510)

对于texture2d,我提取mipmap的纹理,如下所示

pixels=ByteBuffer.allocateDirect(4*width*height);

GL11.glGetTexImage(
                    GL11.GL_TEXTURE_2D,mipMap
                   ,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE
                   ,pixels
                  );

根据文档,如果纹理不是4个分量,它会将所需的分量设置为零,每像素写入4个字节。
稍后,我可以创建一个二维纹理使用像素如下

GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT,4); //4 bytes since RGBA bytes were read from texture

GL11.glTexImage2D(GL11.GL_TEXTURE_2D,0
                 ,GL11.GL_RGB,width,height,0
                 ,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE,pixels);

所以这非常适用于2d纹理。
现在跳到纹理1d数组,我读取特定mipmap的所有层的图像,如下所示

pixels=ByteBuffer.allocateDirect(4*image.width*layers); //again creating RGBA byte buffer because thats the default behaviour

GL11.glGetTexImage(                                     //this will return the texture images of all layers of mipmap level 0
                   GL30.GL_TEXTURE_1D_ARRAY,0
                  ,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE
                  ,pixels
                 );

ByteBuffer levelN=ByteBuffer.allocateDirect(4*image.width);

int offset=4*image.width*level;                         //level is layer 0,layer 1 so on this part reads only the texels of an specific layer
for(int i=offset;i<offset+(image.width*4);i++){levelN.put(pixels.get(i));}

pixels=levelN;

但稍后当我创建texture1d数组时,如下所示

ByteBuffer[] layers=//read using above method

 GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT,4); //4 bytes since RGBA bytes were read from texture

GL11.glTexImage2D(GL30.GL_TEXTURE_1D_ARRAY,0                                //allocate enough storage for all layers
                 ,GL11.GL_RGB,width,layers.length,0
                 ,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE,(ByteBuffer)null);

for(int layer=0;i<layers.length;layer++)
{
 ByteBuffer image=layers[i];

 GL11.glTexSubImage2D(GL30.GL_TEXTURE_1D_ARRAY,0                              //Update individual layers using texSubImage
                      ,0,layer,width,1
                      ,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE,image);
}

颜色显示都不正确,甚至将纹理格式更改为gl\u rgba也没有解决问题。但是当我将常量从4更改为3[在texture 1d array的readmethod()中每像素仅读取3字节]时,一切又正常了。所以我在这里真的很困惑,因为我所有的测试纹理都是rgb格式,而我观察到的是
->对于在glgetteximage()中读取每像素4字节的2d纹理,但随后仅为纹理格式指定rgb有效
->对于1d纹理数组,在glgetteximage()中读取每像素3字节,但随后仅为纹理格式指定rgb有效
但是规格说明,它默认读取所有纹理类型的每像素4字节,除非您使用pixelstorei()更改该行为
我只使用这种方法来创建2d纹理,而不是其他任何地方。
有人能解释一下为什么会有这种差别吗?

9rbhqvlz

9rbhqvlz1#

根据文档,它每像素写4字节[…]
不,没有。 glGetTexImage(...GL_RGB, GL_UNSIGNED_BYTE...) 每像素读取3字节。行的长度与4字节对齐(如果 GL_PACK_ALIGNMENT 是4)。
参数的格式和\u类型 glGetTexImage 不要指定源纹理的格式,而是指定目标缓冲区的格式。

相关问题