# Probleme mit Skysphere in Opengl



## tdc (2. Dez 2011)

Hi!

In meinem 3D-Spiel habe ich schon vor einiger Zeit eine Skysphere (Skybox als Kugel) eingebaut. Keine Probleme macht es mir, auch Objekte dahinter zeichnen zu lassen, dafür reicht ja:

```
glDisable(GL_DEPTH_TEST);
...
//Skysphere wird gezeichnet
...
glEnable(GL_DEPTH_TEST);
```

Allerdings kamen heute 2 neue Probleme dazu:

*1. Schatten auf Skysphere*

Das Problem sollte nicht allzu groß sein. Ich arbeite ja mit Stencil-Buffer Schatten. (da hatte ich ja auch einige Probleme )
Vom Prinzip her müsste es ja eigentlich das gleiche sein, wie beim Depth-Buffer. Meine 2 Ansätze waren:
1.

```
glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
...
glEnable(GL_STENCIL_TEST);
glEnable(GL_DEPTH_TEST);
```
Aber da kommt totaler Mist raus. Okay, als ich im Nachhinein nachgeschaut habe, wie ich die Schatten gemacht habe, ist es auch logisch, dass sowas rauskommt, da dann der Rest direkt in den Stencil-Buffer gezeichnet wird und somit als Schatten dargestellt wird.

2.

```
glDisable(GL_DEPTH_TEST);
glStencilMask(0);
...
glStencilMask(1);
glEnable(GL_DEPTH_TEST);
```
Sah zwar besser aus, allerdings wurden dann die Schatten nicht vollständig gezeichnet.

*2. Antialiasing verursacht bläuliche Linien*
Das viel wichtigere Problem ist, dass ich, wenn ich Antialiasing bei Linien mithilfe folgender Zeile einschalte:

```
glEnable(GL_LINE_SMOOTH);
```
haben die Linien, wenn ich den Himmel zeichnen lasse immer eine leicht bläuliche Färbung.
Wovon kommt das?

Anhang 1: mit Himmel, ohne Antialiasing
Anhang 2: mit Himmel, mit Antialiasing            <--- Linien leicht bläulich
Anhang 3: ohne Himmel, mit Antialiasing

mfg tdc


----------



## Guest2 (2. Dez 2011)

Moin,

also bei Problem 1 kann ich mir das aktuell noch nicht so richtig vorstellen...

bei Problem 2, GL_LINE_SMOOTH ist wahrscheinlich nicht das, was Du möchtest. 

GL_LINE_SMOOTH geht über den Alpha-Wert, nutzt die Blending-Einstellungen und funktioniert (wenn überhaupt) nur wenn der Tiefe nach sortiert gezeichnet wird.

Vermutlich suchst Du ehr was in Richtung FSAA. Das wird bei der Initialisierung gesetzt. Z.B. was in der Richtung von:


```
final PixelFormat pf = new PixelFormat().withSamples(4);
Display.setDisplayMode(new DisplayMode(width, height));
Display.setVSyncEnabled(true);
Display.create(pf);
```

Gruß,
Fancy


----------



## tdc (2. Dez 2011)

Wow! Danke Fancy... mal wieder. 

Das erste Problem bezieht sich auf meinen oben Verlinkten Stencil-Buffer-Schatten. Das Prinzip haben wir dort ja bereits ausführlich durchgekaut:
Man muss das Schatten-Volumen in den Stencil-Buffer zeichnen und der Stencil-Buffer zeichnet den Schatten dann auf die Flächen, die das Schattenvolumen schneiden. Bei meiner Skysphere wird das jetzt leider auch gemacht, obwohl der Depth-Test beim zeichnen (der Skysphere) ausgeschaltet ist. Okay, sie befindet sich aber wohl noch immer im Depth-Buffer. Von daher ist es logisch, dass der Schatten auch auf ihr erscheint. Meine Frage war jetzt, wie ich das umgehen kann, sodass die Skysphere dabei vllt. ignoriert wird.


----------



## Guest2 (4. Dez 2011)

Ja, das ist mir soweit klar. Was mich allerdings irritiert ist, dass Du oben was von Objekten zeichnen schreibst, die hinter der Skysphere liegen. Ich weiß, Galileo und so, aber die meisten Welten haben doch am Himmelsgewölbe ihr natürliches Ende. (Und zumindest bei OpenGL ist man auch froh drum )

Hat Deine Skysphere den eine Transparenz, sodass Du die Objekte dahinter zeichnen willst? Falls ja wird die Reihenfolge in dem die Objekte gezeichnet werden und was/wann in welchem Renderschritt gezeichnet wird schnell relevant. Das könnte möglicherweise sogar hässlich werden. (Z.B. wenn Objekte innerhalb und außerhalb sich gegenseitig beschatten (zwei Lichtquellen) und dazwischen dann das halb transparente Himmelsgewölbe liegt).

Wenn Du Deine Szene genauer beschreibst und auch wie die einzelnen Renderschritte ineinandergreifen, wird vielleicht ehr klar, wo das Problem genau liegt.

Viele Grüße,
Fancy


----------



## faustdonner (24. Sep 2012)

Hallo ich weiss es ist unangebracht hier aber könntest du mir bitte den Code senden für die Skysphere?^^ Ich habe wirklich keine Ahnung wie es geht.


----------

