2017-07-07 125 views
1

我想创建一个动态数组(数组)。但由于某些原因数据被损坏。我正在使用这些数据在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 *)呢?

+0

你是什么意思所有搞砸了?究竟发生了什么? – PYA

+1

unsigned char * imageData = new unsigned char [width * height * 3]; – nullqube

+0

@pyjg:看我的编辑,颜色没有按预期显示。不知道如何更好地描述它,我可以上传截图? – gromit190

回答

3

此行包含多个错误:

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

您应该乘以x的高度,并添加y。还有一个事实,即每个像素实际上是3个字节。在您的代码中导致此错误的一些问题(并将导致其他问题)

  • 您还应该使用std::vector。您可以拨打std::vector::data获取指向底层数据的指针,以连接C API。
  • 您应该有一个表示像素的类。这将正确处理抵消并给出名称并使代码更清晰。
  • 无论何时您正在处理一个多维数组,您将其编码为单维数组,您应该尽量仔细编写一个处理索引的访问函数,以便您可以单独对其进行测试。

(end bulleted list ...哦SO)。

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

重要的是这个设计是面向对象设计,数据持有者被正确的类所取代。不同于可以是任何东西的数组数组。有我的upvote。 – Aziuth

+0

也是(y * WIDTH)+ x。每行都是一行像素,这等于WIDTH(每行完全是WIDTH长度) – nullqube

+0

@nullqube我的意思是完全取决于您想要存储为行主要还是列主要形式,但是当然。我同意你的公式会导致一致的结果,我的结果也一样,但不是原始问题中的结果。 –

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; 
    } 
} 

Unfortunnately这是未经测试,但我相信假设的sizeof(char)的为1