Войти
ПрограммированиеФорумГрафика

Текстура с прозрачностью

#0
7:29, 17 окт. 2020

Здравствуйте!
Рисую красный квад. Далее рисую в его же координатах белый квад с текстурой. Хочу получить там, где в текстуре FF - прозрачность, т.е. красный цвет, там где в текстуре 0 - цвет фона (черный). Не получается.
Текстуру делаю так:

  DASH_IMAGE_SIZE = 8;
  DASH_IMAGE: array [0..4*DASH_IMAGE_SIZE-1] of GLubyte = (
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00);

  glClearColor(0.0, 0.0, 0.0, 0.0);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_NEAREST
  glTexImage1D(GL_TEXTURE_1D, 0, 3, DASH_IMAGE_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, @DASH_IMAGE);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // сюда подставлял разное
  glEnable(GL_ALPHA_TEST);
  glEnable(GL_BLEND);
  glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // сюда подставлял разное
Спасибо.


#1
(Правка: 8:14) 8:13, 17 окт. 2020

greencad
> glEnable(GL_ALPHA_TEST);
> glEnable(GL_BLEND);
Это разные флаги.
Альфа-тест - это когда значение альфы сравнивается с неким фиксированным порогом, если оно выше порога - то пиксель рисуется как есть, если ниже порога - то пиксель не рисуется вообще (это важно в 3д-сценах). Значение порога при этом задаётся отдельной функцией.
А плавное смешивание - это только GL_BLEND, без всяких тестов.

> glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // сюда подставлял разное
Обычный альфа-блендинг, как в прозрачных png - это glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) тоже иногда используется, но для этого нужна специально подготовленная текстура, с premultiplied alpha.

#2
10:14, 17 окт. 2020
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Прозрачность это когда A = 0

#3
10:18, 17 окт. 2020

Delfigamer
> > glEnable(GL_ALPHA_TEST);
> > glEnable(GL_BLEND);
> Это разные флаги.
> Альфа-тест - это когда

нужно сразу посылать в чаво

#4
10:58, 17 окт. 2020

> Delfigamer, 3dhater
Сделал так:

  DASH_IMAGE_SIZE = 8;
  DASH_IMAGE: array [0..4*DASH_IMAGE_SIZE-1] of GLubyte = (
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00,
    $FF, $FF, $FF, $FF,
    $00, $00, $00, $00);

  glClearColor(0.0, 0.0, 0.0, 0.0);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_NEAREST
  glTexImage1D(GL_TEXTURE_1D, 0, 3, DASH_IMAGE_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, @DASH_IMAGE);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  glEnable(GL_BLEND);
  glBlendEquation(GL_FUNC_ADD);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Получаются просто белые полосы, а надо - красные, т.е. чтобы первый квад сквозь текстуру был виден.
ПрограммированиеФорумГрафика