对于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纹理,而不是其他任何地方。
有人能解释一下为什么会有这种差别吗?
1条答案
按热度按时间9rbhqvlz1#
根据文档,它每像素写4字节[…]
不,没有。
glGetTexImage(...GL_RGB, GL_UNSIGNED_BYTE...)
每像素读取3字节。行的长度与4字节对齐(如果GL_PACK_ALIGNMENT
是4)。参数的格式和\u类型
glGetTexImage
不要指定源纹理的格式,而是指定目标缓冲区的格式。