Merkwürdige Verzerrungen
Verfasst: Do Mai 14, 2015 10:28 pm
Moin an alle.
Ich arbeite gerade wieder mal (seit langem) mit OpenGL. Dabei rendere ich eine kleine TileMap und das ganze sieht folgendermaßen aus:
Da ich aber für jedes Teil zunächst einen Draw Call hatte, wollte ich alle Calls zusammenfassen und habe mir alle Vertices in ein zusammenhängendes Array geschrieben. Das ganze ist auch beinahe 30% schneller, aber es kommt zu einem Problem:
Ich sehe derartige Verzerrungen. Der Code ist korrekt und auch die Daten die ich mir natürlich habe ausprinten lassen sind alle ok (keine komischen floats). Hier einmal zur Ansicht:
https://gist.github.com/Dgame/5f4d2a47efaa6007c98b
Ein Vertex hat zunächst eine Position in Pixel, dann die Texture-Koordinaten und anschließend eine Farbe (hier weiß). Und wie man sehen kann: keine komischen float Ausreißer. Weiß jemand woran es liegen kann? Oder welche Gründe so etwas haben kann?
Als Primitive gebe ich GL_TRIANGLE_STRIP an, ich habe aber bereits die meisten anderen durch (von GL_QUADS über GL_QUAD_STRIP zu GL_TRIANGLE_FAN). Vielleicht bemerkt ja jemand etwas was ich nicht bemerke.
Hier einmal der Code wie ich ein Tile hinzufüge:
edit: Es handelt sich bei der Sprache übrigens um D.
Ich arbeite gerade wieder mal (seit langem) mit OpenGL. Dabei rendere ich eine kleine TileMap und das ganze sieht folgendermaßen aus:
Da ich aber für jedes Teil zunächst einen Draw Call hatte, wollte ich alle Calls zusammenfassen und habe mir alle Vertices in ein zusammenhängendes Array geschrieben. Das ganze ist auch beinahe 30% schneller, aber es kommt zu einem Problem:
Ich sehe derartige Verzerrungen. Der Code ist korrekt und auch die Daten die ich mir natürlich habe ausprinten lassen sind alle ok (keine komischen floats). Hier einmal zur Ansicht:
https://gist.github.com/Dgame/5f4d2a47efaa6007c98b
Ein Vertex hat zunächst eine Position in Pixel, dann die Texture-Koordinaten und anschließend eine Farbe (hier weiß). Und wie man sehen kann: keine komischen float Ausreißer. Weiß jemand woran es liegen kann? Oder welche Gründe so etwas haben kann?
Als Primitive gebe ich GL_TRIANGLE_STRIP an, ich habe aber bereits die meisten anderen durch (von GL_QUADS über GL_QUAD_STRIP zu GL_TRIANGLE_FAN). Vielleicht bemerkt ja jemand etwas was ich nicht bemerke.
Hier einmal der Code wie ich ein Tile hinzufüge:
Code: Alles auswählen
/**
* Appends four Vertices arounds the given position with the given texture coordinates
*/
void append()(auto ref const Vector2f position, auto ref const Rect texRect) pure nothrow {
immutable float tx = float(texRect.x) / _texture.width;
immutable float ty = float(texRect.y) / _texture.height;
immutable float tw = float(texRect.width) / _texture.width;
immutable float th = float(texRect.height) / _texture.height;
immutable float tx_tw = tx + tw;
immutable float ty_th = ty + th;
immutable float cx_tw = position.x + texRect.width;
immutable float cy_th = position.y + texRect.height;
_vertices.reserve(4);
_vertices ~= Vertex(
position,
Vector2f(tx, ty),
Color4f.White
);
_vertices ~= Vertex(
Vector2f(cx_tw, position.y),
Vector2f(tx_tw, ty),
Color4f.White
);
_vertices ~= Vertex(
Vector2f(position.x, cy_th),
Vector2f(tx, ty_th),
Color4f.White
);
_vertices ~= Vertex(
Vector2f(cx_tw, cy_th),
Vector2f(tx_tw, ty_th),
Color4f.White
);
}