Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

30.06.2014, 16:26

Wenn ich das richtig verstehe binde ich den Uniform-Buffer dann nicht an den Shader-Parameter mit Namen block_name, sondern an den Shader-Parameter mit Namen instance_name(optional:[x]). Danke, das wird mir wahrscheinlich ziemlich hilfreich sein :)

32

30.06.2014, 18:23

So, ich habe soweit mal alles implementiert. Allerdings taucht ein weiteres Problem auf:

Quellcode

1
2
3
4
5
6
7
8
[...]

layout(std140) uniform Textures
{
    sampler2D DiffuseTexture;
};

[...]


Quellcode

1
2
3
4
5
[Shader] > Compilation failed: Fragment shader failed to compile with the following errors:
ERROR: 0:12: error(#366) 'use sampler/image in interface block' require extension GL_ARB_bindless_texture. but it is not supported on this card
ERROR: 0:16: error(#143) Undeclared identifier: DiffuseTexture
ERROR: 0:16: error(#202) No matching overloaded function found: texture2D
ERROR: error(#273) 3 compilation errors.  No code generated


Eine Google-Suche ergab, dass das Problem daher rührt, dass ich in einem Uniform-Block keine Sampler verwenden kann, da diese keine fest definierte Größe besitzen. Was soll ich jetzt tun? Von Uniform-Buffern muss ich jetzt wohl absehen, und explizite Locations für Uniforms scheint es zwar zu geben, allerdings sind diese weitaus unpraktischer als für Attribute. Was wäre hier wohl die bestmöglichste Lösung?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

33

30.06.2014, 20:59

Du solltest einfach keine Sampler in Uniform Blocks stecken. Einfach altbackende Uniforms dafür wie bisher ;-)
Aber ich sehe das eigentlich ziemlich unkritisch an. Normalerweise weißt man einmal im gesamten Programm einem Sampler-Uniform einmal eine Texture Unit zu und lässt sie dann unberührt. So handhabe ich es zumindest. Weil ich schon häufig darauf reingefallen bin: In ein Sampler-Uniform kommt nicht die Textur ID, nur die Nummer der Unit, an welche die Textur dann gebunden wird.

34

01.07.2014, 00:52

Und woher genau weiß dein Shader dann, welche Textur die Diffuse, welche Diffuse 2, welche Bump-Map, etc. ist? Das Programm muss ja die entsprechend richtige an die korrekte Unit, und damit an den korrekten Parameter, binden. Ein Array von Samplern, oder verschiedene Namen oder etwas wie uniform sampler2D DiffuseTextures[4]; uniform sampler2D BumpMap;?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

35

01.07.2014, 13:16

Du bist dafür verantwortlich, dass du die richtigen Texturen für den richtigen Verwendungszweck an die richtigen Texture Units bindest. Ich würde nicht 4 Texturen für Diffuse Beleuchtung verwenden. Normalerweise würde ich halt die Farbtextur beispielweise an Texture Units 0 binden, die Normalmap an 1, Bump/Displacment an 2 und so weiter. Dabei sollte man wenn möglich natürlich so wenig Texturen wie möglich werden. Dafür bietet es sich manchmal an zb. den Alphakanal der Normalmap als Roughness Parameter zu verwenden.

Werbeanzeige