对于texture2D,我按以下方式提取mipmap的纹理。
根据文档,每像素写入4个字节,如果纹理不是4个分量,则将所需组件设置为零。
稍后,我可以使用这些像素创建2D纹理,如下所示。
但是后来当我创建我的1D纹理数组如下所示
颜色显示不正确,即使将纹理格式更改为GL_RGBA也无法解决问题。但是当我将常量从4更改为3时[只读取1d纹理数组的readMethod()中每个像素的3个字节],一切都正常工作了。所以我很困惑,因为我的所有测试纹理都是RGB格式,而我观察到的是:
pixels=ByteBuffer.allocateDirect(4*width*height);
GL11.glGetTexImage(
GL11.GL_TEXTURE_2D,mipMap
,GL11.GL_RGB,GL11.GL_UNSIGNED_BYTE
,pixels
);
根据文档,每像素写入4个字节,如果纹理不是4个分量,则将所需组件设置为零。
稍后,我可以使用这些像素创建2D纹理,如下所示。
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;
但是后来当我创建我的1D纹理数组如下所示
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_RGBA也无法解决问题。但是当我将常量从4更改为3时[只读取1d纹理数组的readMethod()中每个像素的3个字节],一切都正常工作了。所以我很困惑,因为我的所有测试纹理都是RGB格式,而我观察到的是:
->对于2D纹理,在glGetTexImage()中每个像素读取4个字节,但稍后仅指定RGB作为纹理格式即可。
->对于1D纹理数组,在glGetTexImage()中每个像素读取3个字节,但稍后仅指定RGB作为纹理格式即可。
但specs说它默认读取所有纹理类型的每个像素的4个字节,除非您使用pixelStorei()更改该行为
而我只在创建2D纹理的方法中使用了该方法,没有其他地方使用。
有人能解释一下这些差异吗?
glGetTexImage(...GL_RGB, GL_UNSIGNED_BYTE...)
每个像素读取3个字节。如果GL_PACK_ALIGNMENT
为4,则一行的长度将对齐到4个字节。 - Rabbid76