GLUT纹理人工制品

时间:2015-04-16 12:29:36

标签: c++ pointers opengl textures artifacts

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

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(使用标题,以确保内联):

http://pastebin.com/0HxcAnkW

我是代码中的混乱,但它只是一个爆炸的一面。 我会非常乐意为你提供帮助。

1 个答案:

答案 0 :(得分:3)

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

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

如果您需要动态分配,请使用

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.

选择一个。)