2015-03-09 4 views
-1

Если я отключу текстуры, он правильно рисует белый куб, но когда я включаю текстуры, он ничего не рисует (или черный квадрат того же цвета, что и фон). Единственное, что я подозреваю, это GL_INT, потому что до этого момента я использовал байты без знака в своих проектах.Почему я не могу нарисовать текстуру в pyOpenGL

Edit: мое окно RGB

Вот мой код:

self.texture = glGenTextures(1) 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1) 
    glPixelStorei(GL_PACK_ALIGNMENT, 1) 
    glBindTexture(GL_TEXTURE_2D, self.texture) 
    pix=[255,255,255,0,0,0,255,255,255,0,0,0] 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0.0, 640, 480, 0.0, 0.0, 100.0) 
    glMatrixMode(GL_MODELVIEW) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, 2, 2, 0, GL_RGB, GL_INT, pix) 
    glEnable(GL_TEXTURE_2D) 
    glDisable(GL_LIGHTING) 
    glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); glVertex2i(100, 100) 
    glTexCoord2i(0, 1); glVertex2i(100, 200) 
    glTexCoord2i(1, 1); glVertex2i(200, 200) 
    glTexCoord2i(1, 0); glVertex2i(200, 100) 
    glEnd() 
    glutSwapBuffers() 

ответ

1

Ну, не следует путать формат данные изображения вы имеете в памяти клиента с внутренним форматом из текстуры. В вашем случае вы используете 3 как internalFormat параметр, который является устаревшим ярлыком для GL_RGB и который на практике означает 8 бит на канал RGB-данных.

Когда вы используете GL_INT в качестве клиентского формата, GL будет конвертировать данные во внутренний формат. В этом случае он будет интерпретировать ваши данные как нормализованные целые числа, поэтому INT_MAX (примерно 2 миллиарда и что-то) будет сопоставлен с 1.0. Так как вы используете только номера до 255, они все равно будут равны нулю во внутреннем формате текстуры, поэтому ваша текстура будет эффективно черной.

Я не знаю, что именно вы пытаетесь сделать. Использование формата клиентской стороны с более высокой точностью, чем внутренний формат, почти никогда не будет хорошей идеей, поскольку вся точность будет потеряна в любом случае, а передача данных будет медленнее из-за дополнительного преобразования. Если вам нужна более высокая точность, вы должны фактически использовать некоторый внутренний формат с большим количеством бит на канал. Тем не менее, для меня это совершенно неясно, если вы действительно этого хотите, тем более, что вы используете конвейер с фиксированной функцией.

0

Хорошо, я обнаружил, что в результате проб и ошибок массив должен быть 3D. Этот массив работал для меня (3 * 4 * 3 измерения). Я использовал glTexImage2Df следующим образом:

pix = [[[1.0,1.0.0.0], [0.0,0.0,0.0], [1.0,1.0,1.0] , [0.0,0.0,0.0]], [[1.0,1.0,1.0], [0.0,0.0,0.0], [1.0,1.0,1.0], [0.0,0.0,0.0]], [[1.0,1.0, 1,0], [0,0,0,0,0,0], [1,0,1,0,1,0], [0,0,0,0,0,0]]]

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

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