当前位置:  开发笔记 > 编程语言 > 正文

如何在glTexImage2D中使用动态大小的纹理数组?

如何解决《如何在glTexImage2D中使用动态大小的纹理数组?》经验,为你挑选了1个好方法。

目前,我能够加载我创建的静态大小的纹理.在这种情况下,它是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]:列0> [1]:行0> [2]:通道0 ... n> [n]:行1 ... n> [n]:列1 .. n

......不需要使用三维数组.在这种情况下,我不得不使用这个工作,因为在C++中显然不是严格可能的三维数组.



1> Xcessity..:

好的,因为这花了我很多时间来弄清楚这一点,这里是:

我的任务是使用动态纹理数组实现OpenGL Red Book(9-1,p373,5th Ed.)中的示例.

该示例使用:

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

正如您所猜测的那样,尝试分配三维数组将无法完成任务.Someth.这样就不是工作:

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;

希望这可以帮助...

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有