如何创建数组(数组)的动态数组?

时间:2017-07-07 14:31:27

标签: c++ arrays opengl

我正在尝试创建一个动态数组(数组)。但由于某种原因,数据被破坏了。我正在使用数据在OpenGL应用程序中生成纹理。

以下代码可以正常使用:

unsigned char imageData[64][64][3];
    for (int i = 0; i < 64; i++)
    {
        for (int j = 0; j < 64; j++)
        {
            unsigned char r = 0, g = 0, b = 0;
            if (i < 32)
            {
                if (j < 32)
                    r = 255;
                else
                    b = 255;
            }
            else
            {
                if (j < 32)
                    g = 255;
            }
            imageData[i][j][0] = r;
            imageData[i][j][1] = g;
            imageData[i][j][2] = b;
        }
        std::cout << std::endl;
    }

    glTexImage2D(target, 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);

问题是,我希望能够创建任何大小的纹理(不只是64 * 64)。所以我正在尝试这个:

unsigned char*** imageData = new unsigned char**[64]();
for (int i = 0; i < 64; i++)
{
    imageData[i] = new unsigned char*[64]();
    for (int j = 0; j < 64; j++)
    {
        imageData[i][j] = new unsigned char[3]();
        unsigned char r = 0, g = 0, b = 0;
        if (i < 32)
        {
            if (j < 32)
                r = 255;
            else
                b = 255;
        }
        else
        {
            if (j < 32)
                g = 255;
        }
        imageData[i][j][0] = r;
        imageData[i][j][1] = g;
        imageData[i][j][2] = b;
    }
    std::cout << std::endl;
}

glTexImage2D(target, 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);

但这不起作用,图像变得混乱,所以我假设我正在创建数组(数组)错误?我做错了什么?

另外,我想我应该使用向量代替。但是如何将矢量数据矢量的矢量转换为(void *)?

2 个答案:

答案 0 :(得分:3)

这一行包含多个错误:

unsigned char* pixel = &(imageData[(y * height) + x]);

您应该将x乘以身高并添加y。而且事实上每个像素实际上是3个字节。导致代码中出现此错误的一些问题(并将导致其他问题)

  • 您还应该使用std::vector。您可以调用std::vector::data来获取指向C API的基础数据的指针。
  • 你应该有一个代表像素的类。这将正确处理偏移并给出名称并使代码更清晰。
  • 每当您使用编码为单维数组的多维数组时,您应该尝试仔细编写一个负责索引的访问函数,以便您可以单独测试它。

(结束项目符号列表......哦,所以)。

struct Pixel {
    unsigned char red;
    unsigned char blue;
    unsigned char green;
};

struct TwoDimPixelArray {
    TwoDimArray(int width, int height)
      : m_width(width), m_height(height)
    {
        m_vector.resize(m_width * m_height);
    }

    Pixel& get(int x, int y) {
        return m_vector[x*height + y];
    }

    Pixel* data() { return m_vector.data(); }    

private:
    int m_width;
    int m_height;
    std::vector<Pixel> m_vector;
}

int width = 64;
int height = 64;

TwoDimPixelArray imageData(width, height);

for (int x = 0; x != width ; ++ x) {
    for (int y = 0; y != height ; ++y) {    
        auto& pixel = imageData.get(x, y);

        // ... pixel.red = something, pixel.blue = something, etc
    }
}

glTexImage2D(target, 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData.data());

答案 1 :(得分:0)

您需要使用连续内存才能使用opengl。 我的解决方案受到以前答案的启发,使用不同的索引系统

unsigned char* imageData = new unsigned char[width*height*3];
unsigned char r, g, b;
const unsigned int row_size_bytes = width * 3;

for( unsigned int x = 0; x < width; x++ ) {
   unsigned int current_row_offset_bytes = x * 3;
   for( unsigned int y = 0; y < height; y++ ) {
      unsigned int one_dim_offset = y * row_size_bytes + current_row_offset_bytes
      unsigned char* pixel = &(imageData[one_dim_offset]);
      pixel[0] = r;
      pixel[1] = g;
      pixel[2] = b;
   }
}

不幸的是,这是未经测试的,但我有信心假设sizeof(char)为1。