opengl:用于二维纹理和一维纹理数组混淆的glGetTexImage
opengl : glGetTexImage for 2d textures and 1d texture array confusion
对于 texture2D,我提取纹理贴图如下
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 纹理。
现在跳转到纹理一维数组我读取特定 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_RGBA 也没有解决 problem.but 当我将常量从4 到 3[在纹理 1d 数组的 readMethod() 中每个像素只读取 3 个字节] 一切都再次正常工作。所以我在这里真的很困惑,因为我所有的测试纹理都是 RGB 格式,而我观察到的是
->对于 2D 纹理,在 glGetTexImage() 中每个像素读取 4 个字节,但后来只为纹理格式指定 RGB 有效
->对于一维纹理阵列,在 glGetTexImage() 中每个像素读取 3 个字节,但稍后仅指定 RGB 纹理格式有效
但是 specs 说它默认读取所有纹理类型的每个像素 4 个字节,除非您使用 pixelStorei()
更改该行为
而且我只使用该方法创建 2D 纹理,其他任何地方都没有。
有人能解释一下为什么会有差异吗?
As per the documentation it writes 4 bytes per pixels [...]
不,它没有。 glGetTexImage(...GL_RGB, GL_UNSIGNED_BYTE...)
每个像素读取 3 个字节。一行的长度对齐到 4 个字节(如果 GL_PACK_ALIGNMENT
是 4)。
format 和 glGetTexImage
的参数 _type 不指定源纹理的格式,而是指定目标缓冲区的格式。
对于 texture2D,我提取纹理贴图如下
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 纹理。
现在跳转到纹理一维数组我读取特定 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_RGBA 也没有解决 problem.but 当我将常量从4 到 3[在纹理 1d 数组的 readMethod() 中每个像素只读取 3 个字节] 一切都再次正常工作。所以我在这里真的很困惑,因为我所有的测试纹理都是 RGB 格式,而我观察到的是
->对于 2D 纹理,在 glGetTexImage() 中每个像素读取 4 个字节,但后来只为纹理格式指定 RGB 有效
->对于一维纹理阵列,在 glGetTexImage() 中每个像素读取 3 个字节,但稍后仅指定 RGB 纹理格式有效
但是 specs 说它默认读取所有纹理类型的每个像素 4 个字节,除非您使用 pixelStorei()
更改该行为而且我只使用该方法创建 2D 纹理,其他任何地方都没有。
有人能解释一下为什么会有差异吗?
As per the documentation it writes 4 bytes per pixels [...]
不,它没有。 glGetTexImage(...GL_RGB, GL_UNSIGNED_BYTE...)
每个像素读取 3 个字节。一行的长度对齐到 4 个字节(如果 GL_PACK_ALIGNMENT
是 4)。
format 和 glGetTexImage
的参数 _type 不指定源纹理的格式,而是指定目标缓冲区的格式。