2017-02-12 11 views
0

Я пытаюсь отобразить модель в OpenGL. Я нахожусь в День 4 из C++ и OpenGL (да, я узнал это быстро), и я немного остановлюсь с текстурами.Как сделать свой объект прозрачным, но все же показать текстуру?

У меня возникли проблемы с созданием текстуры альфа-работы. На этом изображении у меня есть этот персонаж из Spiral Knights. Как вы можете видеть на макушке, есть эти белые части. Spiral Knights character with no transparency

Я получил Смешивание включен и моя функция смеси установлена ​​на glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

Как сделать эти треугольники невидимыми, но все еще показывать мою текстуру?

Спасибо.

+1

Threre не являются «треугольниками за текстурами». GL не рисует текстуры, он рисует примитивы. Совершенно неясно, что именно происходит (то, что akoha ценит вашу текстуру, как вы комбинируете текстуру с окончательным цветом фрагмента и т. Д.). Вы также должны знать, что для смешивания потребуется рисовать примитивы в правильном порядке. В этом конкретном случае вы даже можете обойти это, не используя смешение, а просто отбросив на основе альфы. – derhass

+0

Вы говорите «просто отбрасывая на основе альфы». _ - Я провел некоторое исследование по отбрасыванию и тому подобное, но из того, что я прочитал, он может быть медленным. Есть альтернативный метод? Я сделал несколько поисковых запросов для альтернативных методов и включил альфа-тестирование, а затем установил альфа-функцию в 'glAlphaFunc (GL_GREATER, 0.0);' но это, похоже, не работает. –

+0

альфа-тест устарел. современный подход отбрасывается в шейдере. что «медленный» действительно означает в этом контексте, трудно сказать заранее. вы можете вернуться к тесту на позднюю глубину, и вы получите определенную степень неравномерного потока управления. Однако вы получаете независимость заказа взамен. – derhass

ответ

0

Есть две важные вещи, чтобы быть сделано при использовании смешивания:

  1. Вы сусло сортировки примитивов обратно на фронт и делают в таком порядке (порядка независимой прозрачности рендеров на основе буфера глубины еще идет тема исследования).

  2. При использовании текстур для управления альфа-каналом вы должны либо написать шейдер, который каким-то образом передает альфа-значения текстуры, переданные в результирующий цвет фрагмента, либо - если вы используете контур фиксированной функции - вам нужно использовать GL_MODULATE текстурный режим env или GL_DECAL с значением примитивного цвета альфа, установленным в 0, или используйте GL_REPLACE.

+0

Что касается второй части задачи # 2, я знаю, что 'glTexEnvi' принимает 3 аргумента. После прочтения [этой страницы] (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml) Я пошел дальше и попытался сделать то, что вы сказали, на основе информации с этой страницы. Я установил свой внутренний формат в GL_RGBA (в функции 'glTexImage2D'), и я использую' glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); ', но это не совсем похоже на работу. Я что-то упускаю? –

+0

@ XantheDragon: Трудно сказать, не видя ваш код. – datenwolf