GLUT текстуры артефакты

Я пытаюсь визуализировать текстуру на плоскости, используя:

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

Решение

То, что вы используете в качестве текстуры 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.

Выбери один.)

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector