我正在使用以下方式将纹理渲染到平面:
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
我是代码中的混乱,但它只是一个爆炸的一面。 我会非常乐意为你提供帮助。
答案 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.
选择一个。)