Прозрачные текстуры в OpenGL не заменяют Quad Alpha

StackOverflow https://stackoverflow.com/questions/4601424

  •  25-09-2019
  •  | 
  •  

Вопрос

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

// 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();

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

Снимок экрана

Это с альфа на текстурированном квадрате, установленном до 0,5. Если вместо этого я настроил его до 1,0, я верную текстуру без прозрачности, как в (ну хорошо, не могу опубликовать второй скриншот в виде ссылки; это на S330.Photobucket.com/albums/l412/twbwar/albmaction = view¤t = заменить10.png). С альфа 0 я получаю зеленый прямоугольник. Следовательно, мне кажется, что текстурированная четверка смешана с использованием альфа-значения, установленного GLCLOR4D, вместо значения из текстуры, которое я ожидал от GL_replace. (Я также экспериментировал с GL_Decal и GL_Modulate, но я не смог получить поведение, которое я хотел.) Может кто-нибудь сказать мне, как сделать OpenGL использовать текстуру, а не квадратный, альфа для смешивания?

Это было полезно?

Решение

Будьте готовы к путешествию по переулке памяти.

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 в вашем случае). Видеть Этот человек страница Для полных таблиц текстурной среды на основе внутренних форматов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top