2009-04-15 4 views
5

Я попытался исследовать это в Google, но мне не кажется, что у меня есть простые ответы. Это потому, что это не просто или потому, что я не использую правильные ключевые слова?Как сделать прозрачные текстуры в OpenGL?

Тем не менее, это прогресс, который я сделал до сих пор.

  1. Создано 8 вершин, чтобы сформировать 2 квадрата.
  2. Создана текстура с 200-битным значением альфа (примерно, 80% прозрачным).
  3. Назначение той же текстуры каждому квадрату, который отображается правильно.
  4. Заметил, что когда я использую текстуру с 255 альфа, она выглядит ярче.

инициализации что-то вроде следующего:

glClearColor(0.0, 0.0, 0.0, 0.0); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 

glEnable(GL_CULL_FACE); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1, textureIds); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

int i, j; 
GLubyte pixel; 
for (i = 0; i < TEXTURE_HEIGHT; i++) 
{ 
    for (j = 0; j < TEXTURE_WIDTH; j++) 
    { 
     pixel = ((((i & 0x8) == 0)^((j & 0x8) == 0)) * 255); 
     texture[i][j][0] = pixel; 
     texture[i][j][1] = pixel; 
     texture[i][j][2] = pixel; 
     texture[i][j][3] = 200; 
    } 
} 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, 
    TEXTURE_WIDTH, TEXTURE_HEIGHT, 
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture); 

Это несколько похоже на фрагмент кода со страницы 417 в книге, OpenGL Руководство по программированию и создает шаблон проверки.

И затем, функция отображения содержит ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 

// Use model view so that rotation value is literal, not added. 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// ... translation, etc ... 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right 
glEnd(); 

    // not neccecary to repeat, just good practice 
glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right 
glEnd(); 

glFlush(); 
glDisable(GL_TEXTURE_2D); 

glPopMatrix(); 

SwapBuffers(); 

Таким образом, это делает 2-й квадрат в фоновом режиме; Я могу видеть это, но это выглядит, как будто они смешиваются с фоном (я предполагаю, что это потому, что они темнее, с 200 битным альфа, чем 255 бит) вместо текстуры позади ...

Transparent textures not working

As вы можете видеть, нет прозрачности ... Как я могу это исправить?

+0

Вы TEXTURE_HEIGHT дважды в этом цикле вместо TEXTURE_WIDTH – shoosh

+0

Ах спасибо, но это не имеет значения, так как они оба 64. –

ответ

9

Так что другой ответ, который был здесь, но был удален, упоминается об этом - Как правило, для правильной работы альфа-смешивания вам нужно сортировать объекты далеко от ближайшей точки в системе координат камеры.
Вот почему ваши полигоны смешиваются с фоном. Вы можете подтвердить, что это действительно проблема, отключив проверку глубины. Без проверки глубины отображаются все фрагменты, и вы сможете увидеть альфа-смешение.

Подробнее об этом в this page.

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