2015-11-24 1 views
0

Перед тем, как прочитать все это и потеряться, основной вопрос заключается в том, как распаковать один массив пикселей и объяснить, как open gl считывает эти данные. (мой фон не в C++, но в основном python)OpenGL GL_UNPACK_ALIGNMENT

Ваша помощь очень признательна.

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

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

следующий код создает 256 х 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 я сделал 2х2)

[[[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 и все работает

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

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

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); 
+0

Ваш цикл записывает данные только для 256 байтов (64 пикселя), так как 'size' является верхним пределом счетчика циклов. –

+0

Wowww Я так много двигался вокруг, что, наверное, я пропустил это. Спасибо – cronicryo

ответ

5

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

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

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

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) { 
+0

Спасибо за мою собственную глупость хаха – cronicryo

 Смежные вопросы

  • Нет связанных вопросов^_^