[DX11] Spass mit Texturen und Shadern

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Krishty »

ARGH stimmt … kA, wie ich jetzt darauf kam, sry.

Code: Alles auswählen

::ID3D11ShaderResourceView * pRenderTargetSRV = NULL;
ppContext->CreateShaderResourceView(texRTV, NULL, &pRenderTargetSRV); // "NULL to create a view that accesses the entire resource"
Und beim Erzeugen der Render-Target-Textur D3D11_BIND_SHADER_RESOURCE und D3D11_RESOURCE_MISC_GENERATE_MIPS mitangeben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Auch das bring leider keine Veränderung :(
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Krishty »

Nagut, dann machen wir mal eine hoffentlich vollständige Checklist. Komplett durchgehen, doppelt prüfen und vor allem bei Unklarheiten fragen:
  • Ressourcen-Setup
    • Vertex-Shader für Fullscreen-Quad erzeugen (der, den ich gegeben hatte).
    • Pixel-Shader für Fullscreen-Quad erzeugen (der, der die Textur füllen soll).
    • CreateTexture2D() für die Render-Target-Textur. ::D3D11_USAGE_DYNAMIC, ::D3D11_BIND_RENDER_TARGET, ::D3D11_BIND_SHADER_RESOURCE und ::D3D11_RESOURCE_MISC_GENERATE_MIPS angeben.
    • CreateRenderTargetView für die Render-Target-Textur-View mit der Render-Target-Textur und NULL als Description.
    • CreateShaderResourceView() für die Render-Target-Textur-View mit NULL als Description.
    • CreateDepthStencilState() für den Fullscreen-Rect-Depth-Stencil-State. DepthEnable und StencilEnable auf FALSE, D3D11_DEPTH_WRITE_MASK_ZERO als WriteMask. Also Depth-Buffering ausschalten, damit das Quad nicht die Szene verschmutzt.
    • CreateTexture2D() für die Geometrie-Textur. ::D3D11_USAGE_DYNAMIC und ::D3D11_BIND_SHADER_RESOURCE angeben.
    • CreateShaderResourceView() für die Geometrie-Textur-View mit NULL als Description.
  • Rendern der Geometrie-Textur
  • Rendern der Geometrie
    • Input Assembler Stage
    • Vertex Shader Stage
      • Deinen Vertex-Shader binden. KA, wie das bei Effekten läuft – aber mach es genauso, wie es vorher auch funktioniert hat.
      • Update des Constant-Buffers nicht vergessen.
    • Rasterizer Stage
      • Deinen eigenen Rasterizer-State binden, falls du einen hast. Falls nicht, sollte es nicht wehtun.
      • Per RSSetViewports() deinen Viewport binden (mit den Fensterausmaßen, falls du direkt ins Fenster renderst).
    • Pixel Shader Stage
      • Deinen Pixel-Shader binden.
      • Die Geometrie-Textur binden.
      • Eventuelles update des Constant-Buffers, falls für deinen Shader benötigt, nicht vergessen.
    • Output Merger Stage
    • Abschluss
      • Draw-Call genau wie früher.
      • Present(), oder was auch immer du nach dem Modell noch zu tun hast.
Darüber hinaus hilfreich: ClearRenderTargetView() mit abwechselnden Farben, damit du die Geometrie nicht übersiehst, falls sie zufällig dieselbe Farbe hat wie der Hintergrund.

Und ClearDepthStencilView() nicht vergessen.

Wenn das alles drin ist und die Debug-Runtime keine Warnungen ausspuckt und es immernoch nicht will, musst du dich wohl oder übel mit PIX bekannt machen …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Eisflamme »

Nur Mal so von einem Unbeteiligten am Rande: Kristhy, Du gehst tierisch ab.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Krishty »

:)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

vielen dank für dieses super post!
Krishty hat geschrieben:[...]Per RSSetViewports() einen Viewport mit den Ausmaßen der Render-Target-Textur an Slot 0 binden.[...]
Also nicht die Größe meines Fensters sondern meiner Textur? Und er bindet automatisch an den richtigen Slot (pd3dImmediateContext->RSSetViewports(1, &viewport); )?

Das einizge "richtige" Problem was sich eigentlich bisher bei mir aufgetan hat liegt in dem D3D11_USAGE_DYNAMIC der Texturen. Setzt ich das als usage bekomme ich gleich zig Fehlermeldungen für GenerateMips() und CopyResource()
z.B.

Code: Alles auswählen

[...]\Visual Studio 2008\Projects\DirectXSamples\Programm\SimpleSample.hlsl(75,24): warning X3206: implicit truncation of vector type
[...]\Visual Studio 2008\Projects\DirectXSamples\Programm\SimpleSample.hlsl(95,9): warning X3206: implicit truncation of vector type
[...]\Visual Studio 2008\Projects\DirectXSamples\Programm\SimpleSample.hlsl(116,5): warning X3206: implicit truncation of vector type
D3D11: ERROR: ID3D11Device::CreateTexture2D: A D3D11_USAGE_DYNAMIC Resource cannot be bound to certain parts of the graphics pipeline, but must have at least one BindFlags bit set. The following BindFlags bits (0x28) cannot be set in this case: D3D11_BIND_STREAM_OUTPUT (0), D3D11_BIND_RENDER_TARGET (1), D3D11_BIND_DEPTH_STENCIL (0), D3D11_BIND_UNORDERED_ACCESS (0). [ STATE_CREATION ERROR #99: CREATETEXTURE2D_INVALIDBINDFLAGS ]
Eine Ausnahme (erste Chance) bei 0x7586b727 in Programm.exe: Microsoft C++-Ausnahme: _com_error an Speicherposition 0x0018f040..
D3D11: ERROR: ID3D11Device::CreateTexture2D: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #104: CREATETEXTURE2D_INVALIDARG_RETURN ]
D3D11: ERROR: ID3D11Device::CreateRenderTargetView: A RenderTargetView cannot be created from a NULL Resource. [ STATE_CREATION ERROR #138: CREATERENDERTARGETVIEW_INVALIDRESOURCE ]
Eine Ausnahme (erste Chance) bei 0x7586b727 in Programm.exe: Microsoft C++-Ausnahme: _com_error an Speicherposition 0x0018f0f4..
D3D11: ERROR: ID3D11Device::CreateRenderTargetView: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #140: CREATERENDERTARGETVIEW_INVALIDARG_RETURN ]
D3D11: ERROR: ID3D11Device::CreateShaderResourceView: A ShaderResourceView cannot be created from a NULL Resource. [ STATE_CREATION ERROR #129: CREATESHADERRESOURCEVIEW_INVALIDRESOURCE ]
Eine Ausnahme (erste Chance) bei 0x7586b727 in Programm.exe: Microsoft C++-Ausnahme: _com_error an Speicherposition 0x0018f0f4..
D3D11: ERROR: ID3D11Device::CreateShaderResourceView: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #131: CREATESHADERRESOURCEVIEW_INVALIDARG_RETURN ]
D3D11: CORRUPTION: ID3D11DeviceContext::GenerateMips: First parameter is corrupt or NULL. [ MISCELLANEOUS CORRUPTION #13: CORRUPTED_PARAMETER1 ]
Eine Ausnahme (erste Chance) bei 0x7586b727 in Programm.exe: 0x0000087D: 0x87d.
Unbehandelte Ausnahme bei 0x7586b727 in Programm.exe: 0x0000087D: 0x87d.
Es lässt sich nur mit D3D11_USAGE_DEFAULT kompilieren und funktionieren tut es leider dann immernoch nicht :-(
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Nungut, egal. Andere Frage: Ich habe mich mal mit den Unordered Access Views beschäftigt und kann damit soweit auch tun was ich möchte, aber leider scheinbar nur wenn ich einen UAV benutzte. Der jeweils zugehörige ComputeShader schreibt mir in eine Resource, aber wiederhole(also alles nochmal mit neuen Objekten) ich das Ganze für eine andere Resource, landen scheinbar alle Ergebnisse im Nirvana.

Es sieht ungefähr wie folgt aus:

Code: Alles auswählen

	CSSetShader( );
		CreateUnorderedAccessView( );
	CSSetUnorderedAccessViews(  ); //StartSlot entspricht dem jeweiligen nr des uav´s
	Dispatch( 1, 1, 1 );
	
	CopyResource(  );
auch ein ClearUnorderedAccessViewUint( ); löst das Problem nicht. Was könnte ich denn vergessen haben?
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Ok, hat sich erledigt, habe es gelöst bekommen.

Aber eine Frage habe ich trotzdem noch: Wenn man Werte größer oder kleiner als 0.0-1.0, also z.b. -0.5 oder 1.5 in eine Textur einträgt und darstellen lässt werden die Werte geclippt, aber wo genau? Wenn die Werte eingetragen werden oder erst später zur Ausgabe?
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Unknown GER »

Farbwerte liegen prinzipiell im Intervall [0...1]. In einem float steht dir natürlich ein weitaus größerer Wertebereich zur Verfügung. Der Wert wird aber nicht von der Grafikkarte verändert, sondern intern später entsprechend geclippt. Du kannst dir deinen Wertebereich aber selbst auf das Intervall [0...1] abbilden, wenn du Minimum und Maximum kennst. Für [-0.5...1.5] wäre das dann zum Beispiel color = (color + 0.5) / 2. Dadurch entspricht eine -0.5 nun einer 0 und eine 1.5 einer 1 und dein ganzes Intervall kann abgebildet werden.
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Vielen dank hat soweit funktioniert.

An einer anderen Stelle bin ich mal wieder auf ein mir unerklärliches Rätzel gestoßen. Es geht im Prinzip darum, dass ich Werte aus einem Array (als Zwischenspeicher für eine Textur) in einem weiteren Schritt lesen und verrechen möchte

Code: Alles auswählen

//cache ist das array, das mit jeweiligem value gefüllt wird
for(int d = 0; d < 4; d++){
for(int f = 0; f < 4; f++){
for(int k = 0; k < 16; k++){
for(int j = 0; j < 16; j++){	
[...]
cache[k+(d*16)][j+(f*16)] = value;
}}}
// read soll den wert an der bsp Stelle von cache kriegen
float4 read = cache[10][1];
In der weiteren Rechnung stellt sich dank der Fehlermeldung:"error X4586: The total amount of group shared memory (65536 bytes) exceeds the cs_5_0 limit of 32768 bytes" heraus, dass es sich scheinbar um keinen float4 wert handelt der in read steht, sondern irgendetwas anderes. Aber wie komme ich jetzt an meinen Wert? :(
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Hallo,
ich bin mal wieder auf ein Rätzel gestoßen. Ich habe mir jetzt ein RenderTarget wie am Anfang dieses Threads beschrieben, erzeugt. Leider reicht es mir nicht meine Textur nur mit rot zu füllen, da es auf die Dauer etwas langweilig wird, und so will ich gerne meine Szene in die Textur rendern, ähnlich wie z.B. beim Shadowmapping (nur dass ich keine Tiefenwerte schreiben möchte). Ich habe den Input und die Shader angepasst nur leider bleibt meine Textur schwarz. Bzw. für eine ModelviewMatrix mit einer zufällig gefunden Lightposition bekomme ich zwar ein Ergebnis, aber ändere ich die Position aus die Gewünschte, so wird meine Textur wieder schwarz. Was könnte ich denn vergessen haben zu setzen?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Schrompf »

ZUm Rendern in eine Rendertarget-Textur muss man doch keine Shader oder Input Layouts anpassen... einfach die Textur als Renderziel setzen und fertig. Evtl. musst Du noch die Projektionsmatrix etwas anpassen, weil Rendertargets üblicherweise ein anderes Seitenverhältnis als der normale Backbuffer haben. Abgesehen davon da ist aber kein Unterschied.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Spass mit Texturen und Shadern

Beitrag von Grubenlord »

Schrompf hat geschrieben:ZUm Rendern in eine Rendertarget-Textur muss man doch keine Shader oder Input Layouts anpassen... einfach die Textur als Renderziel setzen und fertig.
Ich meinte da nur, dass ich die Shader und co. soweit geändert habe, dass sie meine Geometrie rendern (sollten)
Schrompf hat geschrieben:Evtl. musst Du noch die Projektionsmatrix etwas anpassen, weil Rendertargets üblicherweise ein anderes Seitenverhältnis als der normale Backbuffer haben. Abgesehen davon da ist aber kein Unterschied.
An sich bilde ich alles spherisch ab, dass sollte also nicht das Problem sein :(

Edit: Ich habe ein bisschen weiter getestet und scheinbar funktioniert alles solange die lookAtPosition meiner ModelviewMatrix nicht D3DXVECTOR3 at( 0.0, 0.0, 0.0); ist. Aber eigentlich würde ich da gerne hinschauen. Warum geht das nicht???
Antworten