Le problème avec le rendu naïf d'une petite texture de ligne de balayage sur un grand quadruple plein écran est que la texture augmentera, rendant ce qui était un ensemble de lignes de balayage à pixel unique dans la texture beaucoup plus épaisse, plus floue (selon votre méthode d'interpolation), et généralement plus laid.
Vous devriez plutôt carrelerla texture à travers le quad de manière à conserver un rapport pixel sur texel de 1: 1. Cela implique d'ajuster les coordonnées de texture du quadrilatère afin qu'elles soient supérieures à 1 au maximum, et également de définir le paramètre d'habillage des textures à répéter au lieu de pincer. Si votre texture est de 64x64 pixels et votre écran est de 1024x768 pixels, vous pouvez comprendre que dans l'axe X, vous devez carreler la texture 16 fois (1024/64). De même, sur l'axe Y, vous devez le carreler 12 fois (768/64). Vous pouvez ajuster ce calcul pour les limites réelles de votre texture et de votre écran. Utilisez ces nombres (16 et 12) comme l'étendue maximale des coordonnées de texture de votre quad et vous obtiendrez un bien meilleur résultat. Selon la façon dont votre projection orthographique est actuellement configurée pour les carreaux, vous n'aurez peut-être même pas besoin de la modifier pour le rendre.
Alternativement, vous pouvez adopter une approche de shader: restituer votre scène régulière à une texture, puis rendre cette texture en quadruple plein écran, mais en omettant chaque ligne impaire de pixels. Si vous connaissez les limites de l'écran dans le shader, vous pouvez le faire assez facilement (c'est un pseudo-code , vaguement HLSL-ish, mais devrait se traduire facilement):
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);
}