Das Problem beim naiven Rendern einer kleinen Scanline-Textur auf einem großen Vollbild-Quad besteht darin, dass die Textur vergrößert wird und das ergibt, was war eine Reihe von Ein-Pixel - Abtastlinien in der Textur viel dicker, unschärfer (je nach Interpolationsmethode) und im Allgemeinen hässlicher.
Sie sollten stattdessen kachelndie Textur über das Quad so, dass ein Pixel-zu-Texel-Verhältnis von 1: 1 erhalten bleibt. Dazu müssen Sie die Texturkoordinaten des Quad so anpassen, dass sie im weitesten Maße größer als 1 sind, und den Umbruchparameter für Texturen so einstellen, dass er wiederholt wird, anstatt zu klemmen. Wenn Ihre Textur 64 x 64 Pixel und Ihr Bildschirm 1024 x 768 Pixel beträgt, können Sie sich vorstellen, dass Sie die Textur auf der X-Achse 16 Mal kacheln müssen (1024/64). Ebenso müssen Sie es auf der Y-Achse 12 Mal kacheln (768/64). Sie können diese Mathematik an die tatsächlichen Grenzen Ihrer Textur und Ihres Bildschirms anpassen. Verwenden Sie diese Zahlen (16 und 12) als maximale Ausdehnung der Texturkoordinaten Ihres Quad, und Sie erhalten ein viel besseres Ergebnis. Abhängig davon, wie Ihre orthografische Projektion derzeit für die Kacheln eingerichtet ist, müssen Sie sie möglicherweise nicht einmal ändern, um dies zu rendern.
Alternativ können Sie einen Shader-Ansatz wählen: Rendern Sie Ihre reguläre Szene in eine Textur und rendern Sie diese Textur dann als Vollbild-Quad, lassen Sie jedoch jede ungerade Pixelzeile weg. Wenn Sie die Grenzen des Bildschirms im Shader kennen, können Sie dies ziemlich einfach tun (dies ist Pseudocode , vage HLSL-artig, sollte aber leicht zu übersetzen sein):
float2 screenSize;
sampler2D textureSampler;
float2 textureCoordinate;
float4 main () {
// Interpolation of texture coordinates means that we don't get nice
// integer boundaries we could take the modulus of.
float half_y = textureCoordinate.y * screenSize.y * 0.5;
float delta = round(half_y) - half_y;
float delta_squared = delta * delta;
if (delta_squared < 0.1) {
return texture2D(textureSampler, textureCoordinate);
}
return float4(0,0,0,0);
}