Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

daG

Treue Seele

  • »daG« ist der Autor dieses Themas

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

1

30.06.2010, 23:53

C#/OpenGL: Problem mit VBOs und transparenten PNGs

Hi @all :)

Ich hab ein kleines Problem mit in sich verlappenden VBOs

(Link)


Ok, ich versuchs erst mal ohne viel Quellcode, da ich glaube, dass das ein allgemeines Problem ist.

Wie man auf dem Bild sehen kann, wollen die 4 VBOs sich nicht ineinander verschieben lassen. Da es eine 2D-Engine ist, hab ich die Perspektive ausgeschaltet. Ich benutze ein Tiefenpuffer um die Tiles die weiter unten sind über die anderen Zeichnen zu können. Komischerweise schneidet er den transparenten Bereich des einen VBOs teilweise bei dem anderen aus. Und zwar genau dort, wo der linke VBO Quads hat, die weiter oben sind als die des rechten VBOs.

Ich hoffe ihr konntet mir soweit folgen ^^

Gibt es allgemein etwas zu beachten bei VBOs mit transparenten Texturen oder habt ihr ne Idee woran das liegen könnte?

Hier ein paar Zeilen Code noch :)

OpenGL Einstellungen

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
GL.ClearColor(Color.Black);

GL.Enable(EnableCap.DepthTest);
GL.Disable(EnableCap.Lighting);
GL.Enable(EnableCap.Texture2D);
GL.Enable(EnableCap.Blend);

GL.ClearDepth(1.0f);
GL.AlphaFunc(AlphaFunction.Lequal, 0.1f);
GL.DepthFunc(DepthFunction.Lequal);
GL.ShadeModel(ShadingModel.Smooth);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);


Laden der Textur

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Bitmap bitmap = new Bitmap(source);
Imaging.BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb);

width = (UInt32)bitmap.Width;
height = (UInt32)bitmap.Height;

GL.GenTextures(1, out id);
GL.BindTexture(TextureTarget.Texture2D, id);

GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (float)TextureEnvMode.Modulate);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.LinearMipmapLinear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMagFilter.Linear);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.GenerateMipmap, 1);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);


Zeichnen der VBOs

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(buffer.TexCoordBufferID > 0)
{
    GL.BindTexture(TextureTarget.Texture2D, buffer.TextureID);

    GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.TexCoordBufferID);
    GL.EnableClientState(ArrayCap.TextureCoordArray);
    GL.TexCoordPointer(2, TexCoordPointerType.Float, Vector2.SizeInBytes, IntPtr.Zero);
}

if(buffer.VertexBufferID > 0)
{
    GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.VertexBufferID);
    GL.EnableClientState(ArrayCap.VertexArray);
    GL.VertexPointer(3, VertexPointerType.Float, Vector3.SizeInBytes, IntPtr.Zero);
}

GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.VertexBufferID);
GL.DrawArrays(buffer.DrawMode, 0, buffer.VertexLength);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.07.2010, 00:15

Was genau ist daran so verwunderlich? Du renderst deine Quads, verwendest Alphablending, schreibst in den DepthBuffer. D.h. dort wo die transparenten Stellen der linken Quads sind stehen im DepthBuffer Werte kleiner als die der rechten drin die erst nacher gezeichnet werden. Ergo werden die Pixel der rechten Quads an den Stellen nicht gezeichnet weil der Depth Test fehlschlägt weil dort bereits nähere Pixel sind. Um die Transparenz richtig hinzubekommen musst du alles was dahinter liegt zuerst zeichnen...

daG

Treue Seele

  • »daG« ist der Autor dieses Themas

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

3

01.07.2010, 00:25

Ok, danke erst mal für die schnelle und professionelle Antwort :)

Ich hab extra mehrere unabhängige VBOs, damit ich nur die Teile zeichnen brauch, die auch sichtbar sind. In meinem Fall würde das dann ja nur gehen, wenn ich maximal eine "Zeile" in ein VBO speichere und diese dann nacheinander zeichne (von links oben nach rechts unten).

Aber ob das dann noch performant ist :-/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

01.07.2010, 00:38

Naja eine gute Möglichkeit wäre z.B. ein VBO zu haben und das dynamisch zu füllen. Aber brauchst du eigentlich wirklich den DepthBuffer? Könntest du nicht einfach mit Layern arbeiten wie man das in 2D eigentlich oft und gerne tut? Dann könntest du z.B. einfach alles nach Layer und in Teilen gruppiert in VBOs packen und dann eben layerweise von hinten nach vorne rendern...

daG

Treue Seele

  • »daG« ist der Autor dieses Themas

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

5

01.07.2010, 00:50

Ja, mit Layern arbeite ich schon. Nur bringt mich das an der Stelle nicht weiter, da die beiden VBOs nicht übereinander gezeichnet werden _können_. Auch eine andere Reihenfolge bring mir nichts, da die schon ineinander greifen müssen.

Ich wollte Tiles im folgenden Format benutzen:

(Link)


Jedes VBO ist quasi schon eine kleiner Layer für sich, welche in der richtigen Reihenfolge gezeichnet wird. Zur Zeit benutze ich ein Layer für den Boden und ein für die Bäume und die Erhöhungen etc. Doch wie ich die Nahtstellen zwischen den einzelnen VBOs sauber hingekommen kann weiß ich nicht. Daher hatte ich es mit dem Tiefenpuffer getestet.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.07.2010, 00:55

Überlappen sich die nichttransparenten Teile eines Tiles in einem Layer überhaupt? Wenn nicht verwend einfach gar keinen DepthBuffer, schalt den DepthTest ab und fertig...

daG

Treue Seele

  • »daG« ist der Autor dieses Themas

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

7

01.07.2010, 00:58

Ne, die müssen ja ineinander ^^


(Link)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

01.07.2010, 01:07

Das ist mir klar, dabei sollten sich aber von beiden Nachbarn nur transparente Bereiche überlappen!?

daG

Treue Seele

  • »daG« ist der Autor dieses Themas

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

9

01.07.2010, 01:13

Die sollen halt nahtlos ineinander. Ohne Tiefentest überschreibt der rechte VBO teilweise den linken. Andersrum ist es genauso.

Ich glaub ich brauch ein neues Konzept ^^

Ich hab halt eine sehr große Karte (1 Milliarde Tiles) und damit das funktioniert benutze ich ein Quadtree wo die kleinsten Parts (Quads) 16x16 Tiles groß sind. Diese speichere ich in ein VBO. Die VBOs werden automatisch erzeugt und wieder gelöscht wenn sie nicht mehr benötigt werden. Aber das ganze System setzt voraus, dass ich die VBOs sauber ineinander bekomme :-/

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

10

01.07.2010, 18:43

1 MILLIARDE Tiles??

Wie willst du die denn Speichern, mal ganz abgesehen davon, wie du sie laden willst... o_O

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige