GLUT 纹理人工制品

GLUT textures artefacts

我正在尝试使用以下方法将纹理渲染到平面:

unsigned char image[HEIGHT][WIDTH][3];
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 
             0,                         
             GL_RGB,                      
             WIDTH, HEIGHT, 
             0,                       
             GL_RGB,
             GL_UNSIGNED_BYTE, 
             image);
...
draw();

并且该代码 运行 很顺利,但是我打算在动态分配的数组 GLut 上执行此操作的地方正在渲染人工制品。短码:

unsigned char ***image;
image = new unsigned char**[HEIGHT];
  for (int i = 0; i < HEIGHT; i++ )
  {
    image[i] = new unsigned char*[WIDTH];
    for (int j = 0; j < WIDTH ; j++ )
    {
        image[i][j] = new unsigned char[3];
    }
  }
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 
             0,                         
             GL_RGB,                      
             WIDTH, HEIGHT, 
             0,                       
             GL_RGB,
             GL_UNSIGNED_BYTE, 
             image);
...
draw();

两个数组的内容相同(逐位检查)。 完整代码: main.cpp

http://pastebin.com/dzDbNgMa

TEXT_PLANE.hpp(使用headers,确保内联):

http://pastebin.com/0HxcAnkW

对于代码的混乱,我很抱歉,但这只是爆炸的一面。 如果有任何帮助,我将不胜感激。

您用作纹理的是从 image 开始的 WIDTH * HEIGHT * 3 字节内存。

为此,您需要像第一个示例中那样的连续数据。
您的第二个示例不是数组数组的数组,它是指向指针数组的指针数组。这些指针可以指向任何地方。
(数组不是指针,指针也不是数组。)

如果需要动态分配,使用

unsigned char image* = new unsigned char [WIDTH * HEIGHT * 3];

并进行自己的索引算法;组件将是

image[row * WIDTH + 3 * column]
image[row * WIDTH + 3 * column + 1]
image[row * WIDTH + 3 * column + 2]

(或

image[column * HEIGHT + 3 * row], etc.

选一个。)