Seite 1 von 1

Open GL Array Texture Problem

Verfasst: 11.04.2023, 06:57
von Jonathan
Hi,

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:
2023-04-11_07-46-01_ngfx-ui.png
Die erste Zeile erhält einen funktionierenden Draw Call, danach kommt das Setup für meinen Texture-Array Shader.

2023-04-11_07-44-55_ngfx-ui.png
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;
	...
}
Das Dithering ist hier testweise deaktiviert. Der Punkt ist, dass sobald ich irgendetwas mit dem blue_nosie_map - Sampler mache (was Einfluss auf das Ergebnis hat und somit nicht rausoptimiert wird) überhaupt nichts mehr gerendert wird. Sprich, die ersten 2 Zeilen in der Main-Funktion tun was sie sollen (AlphaChannel als rot darstellen), die letzten 2 sollten eigentlich nicht dafür sorgen können, dass alles unsichtbar wird, aber ihre bloße Existenz verursacht schon die Fehler.
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?