2011-01-05 3 views
0

Я пытаюсь нарисовать частично прозрачную текстуру над цветным квадратом, так что цвет светит сквозь прозрачную часть, создавая контур. Это код:Прозрачные текстуры в OpenGL не заменяют quad alpha

// Setup 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 

// (...) 
// Get image bits in object 't' 
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
// (...) 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

// Underlying coloured quad 
glColor4d(0.0, 1.0, 0.0, 1.0);  
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS); 
    glVertex3d(coords11.first, coords11.second, -0.001); 
    glVertex3d(coords12.first, coords12.second, -0.001); 
    glVertex3d(coords21.first, coords21.second, -0.001); 
    glVertex3d(coords22.first, coords22.second, -0.001); 
glEnd(); 

// Textured quad  
glColor4d(1.0, 1.0, 1.0, 0.5); 
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS); 
    glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0); 
    glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0); 
    glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0); 
    glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0); 
glEnd(); 

Текстура черная, за исключением случаев, когда она имеет контур замка; эта часть прозрачная (и белая). Поэтому ожидаемое поведение представляет собой черный прямоугольник с зеленым контуром. Что я получаю вместо зеленоватый прямоугольник с белым контуром:

Screenshot

Это с альфа на текстурированной четырехугольника равным 0,5. Если вместо этого я устанавливаю его в 1.0, я возвращаю текстуру без прозрачности, как в (ну, не могу опубликовать второй скриншот как ссылку, он находится на s330.photobucket.com/albums/l412/TWBWar/?action = вид & current = replace10.png). С альфой 0 я получаю зеленый прямоугольник. Поэтому мне кажется, что текстурированный квад смешивается с использованием альфа-значения, установленного glColor4d, вместо значения из текстуры, чего я ожидал от GL_REPLACE. (Я также экспериментировал с GL_DECAL и GL_MODULATE, но я не смог получить такое поведение, которое я хотел.) Может ли кто-нибудь сказать мне, как заставить OpenGL использовать текстуру, а не квад, альфу для смешивания?

ответ

9

Приготовьтесь к поездке вниз по переулку памяти.

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...); 

Это 3 проблемы есть. В правой части аргументов (RGBA + UNSIGNED_BYTE) упоминается тип вашего исходного типа данных. назначение тип данных является третьим аргументом (т. е. каким GL будет хранить вашу текстуру как).

Как это было, когда был создан GL 1.0, текстурирование было несколько проще. Таким образом, параметр только требуется указать количество каналов, которые вы хотели для окончательной текстуры, с отображением

1=GL_LUMINANCE 
2=GL_LUMINANCE_ALPHA 
3=GL_RGB 
4=GL_RGBA 

Я считаю, это использование не рекомендуется, но, как вы можете видеть, все еще работает.

Итак ... Ваша текстура хранится как GL_RGB, без альфы.

Остальное - простое применение спецификации. Замена на текстуре с внутренним форматом RGB делает final_color=texture_color и final_alpha=fragment_alpha (также источник от glColor в вашем случае). См. this man page для полных таблиц текстурной среды на основе внутренних форматов.

+0

Спасибо, в этом была проблема. –

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