gpt4 book ai didi

c++ - 如何将动态大小的纹理数组与 glTexImage2D 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 19:55:50 25 4
gpt4 key购买 nike

目前,我可以加载我创建的静态大小的纹理。在本例中为 512 x 512。

这段代码来自标题:

#define TEXTURE_WIDTH 512
#define TEXTURE_HEIGHT 512

GLubyte textureArray[TEXTURE_HEIGHT][TEXTURE_WIDTH][4];

这里是glTexImage2D的用法:

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
TEXTURE_WIDTH, TEXTURE_HEIGHT,
0, GL_RGBA, GL_UNSIGNED_BYTE, textureArray);

这是我填充数组的方式(粗略的示例,不是我代码的精确拷贝):

for (int i = 0; i < getTexturePixelCount(); i++)
{
textureArray[column][row][0] = (GLubyte)pixelValue1;
textureArray[column][row][1] = (GLubyte)pixelValue2;
textureArray[column][row][2] = (GLubyte)pixelValue3;
textureArray[column][row][3] = (GLubyte)pixelValue4;
}

如何更改它以便不需要 TEXTURE_WIDTH 和 TEXTURE_HEIGHT?也许我可以使用指针式数组并动态分配内存...

编辑:

我想我看到了问题所在,在 C++ 中它真的无法完成。 Budric 指出的解决方法是使用一维数组,但使用所有 3 个维度相乘来表示索引:

GLbyte *array = new GLbyte[xMax * yMax * zMax];

要访问例如 1/2/3 的 x/y/z,您需要执行以下操作:

GLbyte byte = array[1 * 2 * 3];

但是,问题是,我认为 glTexImage2D 函数不支持这个。任何人都可以想出适用于此 OpenGL 函数的解决方法吗?

编辑 2:

注意 OpenGL 开发人员,这可以通过使用一维像素数组来克服...

[0]: column 0 > [1]: row 0 > [2]: channel 0 ... n > [n]: row 1 ... n > [n]: column 1 .. n

...无需使用 3 维数组。在这种情况下,我不得不使用这个解决方法,因为 3 维数组在 C++ 中显然不是严格可行的。

最佳答案

好吧,因为这花了我很长时间才弄明白,这里是:

我的任务是使用动态纹理数组实现 OpenGL 红皮书(9-1,p373,第 5 版)中的示例。

示例使用:

static GLubyte checkImage[checkImageHeight][checkImageWidth][4];

正如您所猜测的那样,尝试分配一个 3 维数组是行不通的。一些。像这样有效:

GLubyte***checkImage;
checkImage = new GLubyte**[HEIGHT];

for (int i = 0; i < HEIGHT; ++i)
{
checkImage[i] = new GLubyte*[WIDTH];

for (int j = 0; j < WIDTH; ++j)
checkImage[i][j] = new GLubyte[DEPTH];
}

您必须使用一维数组:

unsigned int depth = 4;

GLubyte *checkImage = new GLubyte[height * width * depth];

您可以使用此循环访问元素:

for(unsigned int ix = 0; ix < height; ++ix)
{
for(unsigned int iy = 0; iy < width; ++iy)
{
int c = (((ix&0x8) == 0) ^ ((iy&0x8)) == 0) * 255;

checkImage[ix * width * depth + iy * depth + 0] = c; //red
checkImage[ix * width * depth + iy * depth + 1] = c; //green
checkImage[ix * width * depth + iy * depth + 2] = c; //blue
checkImage[ix * width * depth + iy * depth + 3] = 255; //alpha
}
}

不要忘记正确删除它:

delete [] checkImage;

希望这有助于...

关于c++ - 如何将动态大小的纹理数组与 glTexImage2D 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679210/

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