Работя в 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 е настроен на червено.