gpt4 book ai didi

c++ - 在 OpenGL 中重组图像/图片数组以适应 2 纹理大小的幂

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:30 26 4
gpt4 key购买 nike

我在 OpenGL 中遇到了麻烦,因为在 OpenGL 中纹理必须是 2 的幂。我正在做的是以下内容:

我使用 PNGLIB 或 SOIL 将 PNG 文件加载到一个无符号字符数组中。这个想法是我可以运行这个数组并“选择”与我相关的部分。例如,假设我加载了一个人,但我只想将头部存储在一个单独的纹理中。所以我循环遍历数组并只选择必要的部分。

第一个问题:我相信数组中的数据是以RGBA模式存储的,但我还不确定数据是按行填充还是按列填充。有可能知道这些信息吗?

第二个问题:因为总是需要创建 2 次幂的纹理,所以我有一个宽度为 513 像素的图像,所以我需要一个宽度为 1024 像素的纹理。所以发生的事情是图片看起来像被完全“破坏”了,因为像素不在它们应该在的地方 - 纹理的大小与数组中填充的相关数据不同。那么我怎样才能设法重新组织数组以再次获取图像的内容呢?我尝试了以下但它不起作用:

unsigned char* new_memory = 0;

int index = 0;
int new_index = 0;
new_memory = new unsigned char[new_tex_width * new_tex_height * 4];

for(int i=0; i<picture.width; i++) // WIDTH
{
for(int j=0; j<picture.height; j++) // HEIGHT
{
for(int k=0; k<4; k++) // DEPTH
new_memory[new_index++] = picture.memory[index++];//picture.memory[i + picture.height * (j + 4 * k)];
}
new_index += new_tex_height - picture.height;
}


glGenTextures(1, &png_texture);
glBindTexture(GL_TEXTURE_2D, png_texture);

glTexImage2D(GL_TEXTURE_2D, 0, 3, new_tex_width, new_tex_height, 0 , GL_RGBA, GL_UNSIGNED_BYTE, new_memory);

最佳答案

很早以前就支持了两个纹理的非幂。然而,创建纹理图集和重新排列纹理仍然有很多优点,我们的做法是简单地使用 freeimage因为他们会为您处理所有这一切并支持一些压缩格式。

如果你想按自己的方式做,并且知道它只是一个位图,那么我会按照以下方式做更多(未经测试,不检查输入,但应该给你一个想法):

void Blit( int xOffset, int yOffset, int targetW, int sourceW, int sourceH, unsigned char* source, unsigned char* target, unsigned int bpp )
{
for( unsigned int i = 0; i < sourceH; ++i )
{
memcpy( target + bpp * ( targetW * ( yOffset + i ) + xOffset ), source + sourceW * i * bpp, sourceW * bpp );
}
}

基本上,只需取出每一行并将其 memcpy 过来。

关于c++ - 在 OpenGL 中重组图像/图片数组以适应 2 纹理大小的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11080503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com