2016-05-18 25 views
1

Wenn ich in GLSL über ein Sampler2DMS auf eine Multisample-Textur zugreife, woher weiß ich, welche der Samples in einem Texel dieser Multisample-Textur tatsächlich abgedeckt wurden?GLSL Access Coverage-Maske von sampler2D texel

Von Multisample- Verlängerungs Referenz: „... Jedes Pixelfragment besteht somit aus ganzzahligen x und y Gitterkoordinaten, eine Farbe, SAMPLES_ARB Tiefenwerten, Texturkoordinaten, und einen Überdeckungswert mit maximal SAMPLES_ARB Bits“.

Also was ich gerne zugreifen möchte, ist der Abdeckungswert des Texels. Es gibt gl_SampleMask (https://www.opengl.org/sdk/docs/man/html/gl_SampleMask.xhtml), die ich verwenden kann, um den Coverage-Wert des aktuell verarbeiteten FRAGMENTS zu schreiben, aber wie kann ich auf den Coverage-Wert des TEXEL zugreifen, den ich von der Multisample-Textur abrufe?

Antwort

3

Die Idee mit Multisampling ist, dass Sie beim Rendern auf ein Multisampling-Bild den Fragment-Shader nur einmal für jeden pixelgroßen Bereich ausführen. Die Rasterizer-generierte Überdeckungsmaske bestimmt, welche Abtastwerte innerhalb des Pixels die Ausgaben des Fragments betreffen.

Aber sobald dieser Prozess abgeschlossen ist, einmal der Fragment-Shader seine Daten schreibt, hat das Multisample-Bild selbst absolut keine Ahnung, was diese Abdeckungsmasken sind. Eine Multisample-Textur hat einfach mehrere Abtastwerte pro Texel. Es hat keine Ahnung welche Fragmente welche Samples mit welchen Sample Masken erzeugten.

Beispielmasken sind nur ein Teil des Renderings.

Denken Sie daran so. Dies ist eine Pixel Multisample- Textur:

vec4 pixel[SAMPLE_COUNT]; 

Ihre Fragment-Shader, wenn Sie auf die Multisample-Textur-Rendering wurden, tat das Äquivalent dieser:

for(int sample_ix = 0; sample_ix < SAMPLE_COUNT; ++sample_ix) 
{ 
    if(sampleMask[sample_ix]) 
    pixel[sample_ix] = output; 
} 

pixel ‚s Daten können ursprünglich aus einem gekommen sind Beispielmaske. Aber pixel hat keine Ahnung, dass dies passiert; es ist nur ein Array von vec4 Werten.

Sie können den Coverage-Wert Ihres aktuellen Fragments erhalten. Dies steht jedoch in keinem Verhältnis zu den tatsächlichen Überdeckungswerten, mit denen die Pixel in einer Multisample-Textur ursprünglich zusammengesetzt wurden.

+0

Danke Nicol, das ist eine sehr klare und verständliche Erklärung! Als eine verwandte Frage ist es stattdessen möglich, leicht (ohne Iteration) zu prüfen, ob die Proben eines Texels in einer multisamplizierten Textur alle gleich sind oder nicht? – user1282931

+0

@ user1282931: Nein;) Es wäre schön, aber sie speichern diese Informationen nicht. –