Я пытаюсь визуализировать текстуру на плоскости, используя:
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
Мне жаль за беспорядок в коде, но это только взрывная сторона.
Я был бы очень рад любой помощи.
То, что вы используете в качестве текстуры 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.
Выбери один.)