Ich probiere gerade Dithering als Alphablending Alternative aus und hänge jetzt an einem merkwürdigen Problem fest seit ich die Noise-Textur durch ein Texture-Array ersetzt habe um sie pro Frame zu animieren.
Wenn ich mein Programm mit nSight debugge, kommt die Meldung "Unsupported API usage or environment detected." und die Warnung, das gesammelte Daten nicht akkurat sein müssen. Mehr Details gibts nicht ("Internal function (unexpected API error introduced prior to API call" - na toll.)
Das Programm selber läuft, aber der DrawCall schlägt fehl, und rendert nichts. Der Rest der Szene sieht normal aus. nSight sagt, dass glDrawElements in INVALID_OPERATION generiert, die dokumentierten Grüde dafür scheinen aber alle nicht zuzutreffen.
Ansonsten sieht aber alles ok aus. Ich kann in nSight die OpenGL aufrufe sehen und auch alle States scheinen soweit ok. Das Texture Array selber kann ich mir auch anzeigen lassen, das erstellen der Textur scheint also ohne Probleme zu klappen.
2 Screenshots aus nSight:
Die erste Zeile erhält einen funktionierenden Draw Call, danach kommt das Setup für meinen Texture-Array Shader.
So sehen die Bindings aus.
Der Shader selbst sieht in etwa so aus:
Code: Alles auswählen
uniform sampler2DArray blue_noise_map;
uniform int u_blue_noise_index;
void main()
{
...
// Test:
shader_color.rgb += (1-shader_color.a) * vec3(1, 0, 0);
shader_color.a = 1;
float threshold = texture(blue_noise_map, vec3(gl_FragCoord.xy / 128, u_blue_noise_index)).x;
shader_color.a -= threshold*0.5;
...
}
Wie gesagt, mit einer normalen Textur hat das Dithering schon ganz gut geklappt. Unterschiede können eigentlich nur sein:
- Wie das Texture Array erstellt wird
- Wie es an den Shader gebunden wird
- Wie der Sampler im Shader benutzt wird
Die ersten 2 Punkte sehen in nSight gut aus (ich kann die Textur dort anschauen und das Binding ist korrekt), der letzte scheint so trivial, dass er nicht falsch sein kann. Und die Fehlermeldung hilft mir nicht weiter. Natürlich warn nSight, dass der Output nicht vertrauenswürdig ist, weil meine API Benutzung halt anscheinend inkompatibel ist, aber alles was ich in nSight sehe ist auch, was ich in meiner Engine setze. Das ist halt nur schwer zu zeigen weil es über 20 Dateien verstreut ist...
Irgendwelche Ideen?