Main Menu

Fragen zum FrameBuffer

Started by n0iz, May 21, 2013, 05:41:56 PM

Previous topic - Next topic

n0iz

Hi,
erst mal ein dickes Dankeschön für die coole GL Engine, mach Spass damit zu arbeiten ;)

Zurzeit bau ich eine 3D GUI für ein Android Augmented Reality App das jpct-ae verwendet.
Hab mich nach längerem suchen (hier im Forum) dazu entschlossen die GUi in eine zweite World zu zeichenn, damit ich nicht ständig die UI Elemente an der Kamera ausrichten muss.

Funktioniert soweit alles prima, nur bekomme ich bei Texturen mit Alpha Channel Probleme mit der Transparenz. Hab hier mal einen Screenshot Ausschnitt.


Ich versuch das jetzt mal zu erläutern  ::)
Also die blauen Cubes sind AR Dummy Objekte z.B. z.B. Gebäude in World 1 (AR), also die bewegen sich, wenn ich mich bzw das Android Gerät drehe.
Das mit 1 makrierte Rechteck ist eine Plane in World 2 (GUI),
Das mit 2 markierte Rechteck ist eine genau wie 1 nur mittels Render to Texture auf den FrameBuffer geblitet mit TRANSPARENT_BLITTING.


Das Problem ist nun, wie man auf dem Screenshot sieht, das die Plane von Rechteck 1. komplett in den FrameBuffer gezeichent wird und Objekte aus World 1 überdeckt. Ich vermute mal das liegt daran, dass die transparenten Pixel auch in den Framebuffer geschrieben werden?
Wenn dem so ist, gibt es die Möglichkeit die Transparenten Pixel nicht mit zu zeichnen?
Oder liegt das daran, das ich png Texturen mit eigenen Alpha channel verwende?

Hab ich versucht mittels RenderToTexture das ganze zu umgehen, Rechteck 2.
Wenn ich hier mit OPAQUE_BLITTING komme, tritt das gleiche Problem auf wie bei Rechteck 1, dass die gerenderte Textur alles was unter ihr liegt transparent überdeckt.
Mit TRANSPARENT_BLITTING funktioeniert es, aber überdeckte AR Objekte aus World 1 werden leicht transparent?!? :o

Meine Code sieht ungefähr so aus

onSurfaceChanged(){
            FrameBuffer fb = FrameBuffer(w,h);
            World arWorld=new World();
            World uiWorld=new World();
            ...
}

onDrawFrame(){
            ...
            fb.clear();
            arWorld.renderScene(fb);
            arWorld.draw(fb);

            fb.clearZBufferOnly();
            uiWorld.renderScene(frameBuffer);
            uiWorld.draw(frameBuffer);

            ...

            frameBuffer.blit(renderedTexture, ... , FrameBuffer.TRANSPARENT_BLITTING);

            fb.display();
}


Hoffe jemand kann mit da helfen, bin schon kurz davor meine GUI Welt als Textur zu rendern und darüber zu legen.. oder andersherum die AR Welt als Textur rendern und die GUi Welt darüber...

Hoffe das war einigermaßen verständlich ;)

Grüße n0iz



EgonOlsen

Wenn du den FrameBuffer transparent hast (d.h. die Kamerasicht liegt im Hintergrund), dann hat er einen Alphakanal. Jeder Rendervorgang schreibt in diesen Alphakanal. Somit ändert sich die Transparent von überschriebenen Objekten (in diesem Fall z.B. die blauen Boxen) durch ein Überschreiben mit GUI-Elementen.
Das diese ebenfalls in ihrer Transparent mit den Boxen interagieren, ist völlig normal. Das ist ja der Sinn von Transparenz und das bekommst du auch mit der Aufteilung in zwei World-Instanzen nicht weg. Wie wäre es denn, wenn du die GUI einfach nicht transparent zeichnest?

n0iz

Mkay,
ist zwar nicht das was ich hören wollte ;) aber gut.
Werd wohl auf die transparenten Texturen verzichten müssen und das ganze anständig in 3D zeichnen.
Mir gings eigentlich hauptsächlich darum, runde Ecken hin zu bekommen, deswegen die transparente Textur.
Hab nun einfach die Ecken der Fläche ein bisschen abgerundet, und tada, sieht fast gut aus  ;)