OpenGL GL_UNPACK_ALIGNMENT

Прежде чем прочитать все это и заблудиться, мой главный вопрос - как распаковать один массив пикселей и объяснить, как open gl читает эти данные. (мой фон не в C++, но в основном Python)

Ваша помощь очень ценится.

Я использую Maya(3D-программу), которая имеет класс MImage, чтобы получить данные пикселей изображения. возвращаемый результат - один массив с каждыми 4 элементами RGBA, это то, что мне нужно распаковать

pixels = [255, 255, 0, 255, 255, 255, 0, 255] //two yellow pixels and it keeps going with this pattern

следующий код создает изображение 256 x 256 с 4 каналами

unsigned int size = 256;
unsigned int depth = 4;

float color[3] = {1, 1, 0};

unsigned char *pixels = new unsigned char[size * size * depth];
for(unsigned int i = 0; i < size; i += depth){
    MScriptUtil::setUcharArray(pixels, i+0, (int)floorf(color[0] * 255.0f + 0.5f));
    MScriptUtil::setUcharArray(pixels, i+1, (int)floorf(color[1] * 255.0f + 0.5f));
    MScriptUtil::setUcharArray(pixels, i+2, (int)floorf(color[2] * 255.0f + 0.5f));
    pixels[i + 3] = 255;
    }

глядя на эту проблему, я наткнулся на этот фрагмент (который создает шаблон проверки), который с последним блоком кода работает и показывает, что я пытаюсь сделать

static GLubyte checkImage[256][256][4];

int i, j, c;

for (i = 0; i < 256; i++) {
    for (j = 0; j < 256; j++) {
        c = ((((i&0x8)==0)^((j&0x8))==0))*255;
        checkImage[i][j][0] = (GLubyte) c;
        checkImage[i][j][1] = (GLubyte) c;
        checkImage[i][j][2] = (GLubyte) c;
        checkImage[i][j][3] = (GLubyte) 255;
    }
}

этот массив становится (вместо 256x256 я сделал его 2x2)

[[[255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255]]]// so on and so forth

с этим я установил GL_UNPACK_ALIGNMENT в 1, и все работает

я просто не могу понять, как gl читает массивы и как это сказать

для доказательства кода вот что я получил

glDisable ( GL_LIGHTING );
glEnable(GL_TEXTURE_2D);


glGenTextures(1, &glTextureObject);

// set the current texture to the one just created
glBindTexture (GL_TEXTURE_2D, glTextureObject);

// repeat the texture in both directions
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

// use bi-linear filtering on the texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);

// load the texture data into the graphics hardware.
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

1 ответ

Решение

GL_UNPACK_ALIGNMENT значение не должно вступать в игру здесь. Значение по умолчанию равно 4. Поскольку при использовании значений RGBA у вас есть 4 байта на пиксель, размер строки всегда кратен 4.

Значение нужно менять только в том случае, если количество данных в строке не кратно 4. Например, если у вас есть данные RGB с 3 байтами на пиксель, вам нужно изменить его на 1, если строки не выровнены. до 4-х байтовых кратных с дополнительным заполнением.

Реальная проблема, которую я вижу в вашем коде - это цикл:

for(unsigned int i = 0; i < size; i += depth){
    MScriptUtil::setUcharArray(pixels, i+0, (int)floorf(color[0] * 255.0f + 0.5f));
    MScriptUtil::setUcharArray(pixels, i+1, (int)floorf(color[1] * 255.0f + 0.5f));
    MScriptUtil::setUcharArray(pixels, i+2, (int)floorf(color[2] * 255.0f + 0.5f));
    pixels[i + 3] = 255;
}

поскольку size 256, это заполнит только первые 256 байтов (соответствующих 64 пикселям) данными. Чтобы соответствовать определениям и остальной части вашего кода, этот цикл должен быть:

for(unsigned int i = 0; i < size * size * depth; i += depth) {
Другие вопросы по тегам