Изобразяване на прозрачна текстура върху glTexture

Работя в opengl за известно време сравнително гладко, но наскоро забелязах, че когато изобразя примитив с прозрачна текстура върху моята fbo текстура (персонализиран кадров буфер), това прави fbo текстурата прозрачна в пикселите текстурата на примитива е прозрачен. Проблемът е, че зад този примитивен (с плътен цвят) има неща, които вече са изобразени преди прозрачния. Така че fbo текстурата не трябва да е прозрачна в тези пиксели - смесването на плътен и прозрачен цвят трябва да доведе до плътен цвят, нали?

Така че основно opengl добавя прозрачност към моята fbo-текстура само защото последният изчертан примитив има прозрачни пиксели, въпреки че зад него има плътни цветове, които вече са начертани в fbo текстурата. Не трябва ли opengl да смесва прозрачната текстура със съществуващите пиксели на fbo и да доведе до плътен цвят, ако текстурата на fbo вече е запълнена с плътни цветове, преди да изобрази прозрачния примитив?

Това, което се случва, когато рендерирам моята fbo текстура в буфера на рамката по подразбиране, е, че чистият цвят преминава през части от него - където последната изчертана текстура е прозрачна. Но когато визуализирам същата сцена направо в буфера за рамки opengl по подразбиране, сцената изглежда добре и ясният цвят не се влива в прозрачната текстура.

Още по-интересното е, че glClearColor - цветът се вижда само там, където алфата на текстурата на примитива има градиент - ясният цвят няма влияние върху това къде алфа текстурата е 1.0 или 0.0... това грешка ли е? Изглежда, че влияе най-много на текстурата на примитива при пиксели с 0,5 алфа. След това преминаването по-нагоре или надолу намалява влиянието на glClearColor.

Знам, че това е малко сложен въпрос/ситуация, честно казано се постарах да обясня

Аз използвам:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

за да начертаете както частично прозрачния примитив в fbo-текстурата, така и fbo текстурата в фреймбуфера по подразбиране

Ето как изглежда fbo-текстурата, начертана в opengl fbo по подразбиране:

glClearColor е настроен на червено.


person HelloWorldCpp    schedule 23.03.2017    source източник
comment
Преди да начертаете текстурата на fbo на екрана, помните ли да нулирате смесването? Също така всеки код или екранна снимка на случващото се би било хубаво.   -  person vallentin    schedule 23.03.2017
comment
Проверихте ли, че GL_BLEND е активиран?   -  person Matteo Mecucci    schedule 23.03.2017
comment
Екранната снимка е добавена :) Не искам да нулирам смесването, защото искам да имам прозрачни fbo-текстури, проблемът е, че fbo-текстурата е прозрачна там, където не трябва да бъде, смесвайки се с ясния цвят на рамката по подразбиране буфер   -  person HelloWorldCpp    schedule 23.03.2017
comment
Къде виждате прозрачност, където не трябва да я има? Не може ли това да е просто резултат от филтриране? (Когато текстурата на fbo се приложи към четворката)   -  person vallentin    schedule 23.03.2017
comment
Изглежда, че clearColor е (червено) засяга fbo-текстурата, където текстурата на четворката има градиент, напълно непрозрачните части са правилни (вляво на изображението), а напълно прозрачните части също са правилни, смесвайки се напълно с фона ( дясна страна) - градиентът между тях обаче се влияе от ясния цвят   -  person HelloWorldCpp    schedule 23.03.2017
comment
Ако премахна алфата на fbo-текстурата (настроя я на const 1.0 за всеки пиксел в шейдъра), тогава сцената се изобразява добре. Но имам нужда fbo-текстурата да бъде прозрачна в пикселите, където не рисувам нищо, така че моето подозрение е, че проблемът възниква, когато рисувам в fbo-текстурата. Opengl добавя прозрачност към части, които не би трябвало да са прозрачни, тъй като четворката трябва да се слее с небето, създавайки плътен цвят (тъй като небето е плътен цвят с 1.0 алфа)   -  person HelloWorldCpp    schedule 23.03.2017


Отговори (1)


добре, благодаря, следвах вашите инструкции и промених от eclipse luna на ADT пакета eclipse. Работи сега!
person Nicol Bolas    schedule 23.03.2017
comment
Хей, съжалявам, че се върнах, но сега, когато нулирам всички компоненти на маската до true след завършване на изобразяването на 1-вата fbo-текстура и след това се опитам да изобразя друг слой (2-ра fbo-текстура) ЗАД първата fbo-текстура, прозрачната четворна текстура от 1-вата fbo-текстура се вижда само там, където вече има плътни цветове в тази fbo.. работи добре за 1 fbo-текстура обаче! Някаква идея как мога да изобразя правилно няколко fbo-текстури една върху друга? Благодаря ви предварително - person HelloWorldCpp; 23.03.2017
comment
Ако не нулирам glColorMask, тогава долният слой изобщо не се рисува - person HelloWorldCpp; 23.03.2017