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

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

26.02.2013, 20:10

DX11: Konstante M-Buffer für HLSL Shader

Hallo zusammen.
Ich bins nochmals.

Ich bekomme mein erstes-Dreieck-Programm in DX11 einfach nicht zum laufen. Solange ich im HLSL-Shader keine Berechnungen durchführen lasse ist alles in Butter. Doch sobald ich die Kommentare entferne wird mein Fenster einfach leer. Gut ist, dass nichts abstürzt.

(Also das schöne Dreieck ist dann nicht sichtbar)



(Link)




HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct VS_INPUT
{
float4 Pos : POSITION;
float4 Color : COLOR;
};

// ...

PS_INPUT VS( VS_INPUT input )
{
PS_INPUT output = (PS_INPUT)0;

// Dieser Code funktioniert nicht. Sind die M vielleicht NULL ?
// Keine Ahnung wie ich HLSL-Shader "debuggen" soll :(
/*output.Pos = mul( input.Pos, World );
output.Pos = mul( output.Pos, View );
output.Pos = mul( output.Pos, Projection );*/

// Funktioniert wunderbar
output.Pos = input.Pos;
output.Color = input.Color;

return output;
}



Irgendwas muss ich falsch machen. Aber nach nunmehr 4 Tagen kann ich nach dem 6. Aufsetzen des Quellcodes keinen Fehler finden:

Zuerst erstell ich ferinsäuberlich meine DX11-Schnittstelle. Das funktioniert ohne Shaderkrams auch wunderbar.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**********

Codeteil: DX11 initialisieren. Mit Sorgfalt debuggt. Läuft wie eine eins

**********/

// Initialisierungen usw.

// NUN DEN BUFFER FÜR DEN SHADER ERSTELLEN!

// Wie gehabt...
D3DXMatrixIdentity(&g_World);
D3DXMatrixLookAtLH(&g_View, &D3DXVECTOR3(0.0f, 0.0f, 5.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
D3DXMatrixPerspectiveFovLH( &g_Projection , (0.78539816f), (float)(SCREEN_WIDTH/SCREEN_HEIGHT), 0.01f, 100.0f);

// Buffer erstellen
D3D11_MAPPED_SUBRESOURCE mappedResource;
ConstantBuffer* dataPtr;
unsigned int bufferNumber;

// (Das ist eine vorrübergehende Lösung)
D3DXMATRIX local_world, local_view, local_projection;

D3DXMatrixTranspose(&g_World, &local_world);
D3DXMatrixTranspose(&g_View, &local_view);
D3DXMatrixTranspose(&g_Projection, &local_projection);

// Lock the constant buffer so it can be written to.
hr = devcon->Map(g_pConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);

// Get a pointer to the data in the constant buffer.
dataPtr = (ConstantBuffer*)mappedResource.pData;

dataPtr->mProjection = local_projection;
dataPtr->mView = local_view;
dataPtr->mWorld = local_world;

// Unlock the constant buffer.
devcon->Unmap(g_pConstantBuffer, 0);

// Set the position of the constant buffer in the vertex shader.
bufferNumber = 0;

// Finanly set the constant buffer in the vertex shader with the updated values.
devcon->VSSetConstantBuffers(bufferNumber, 1, &g_pConstantBuffer);


Nun wird gerendert!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));

// select which vertex buffer to display
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);

// Dreiecksliste
devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

if ( nullptr != g_pConstantBuffer) {

ConstantBuffer cb;

// Alles neu!
D3DXMatrixIdentity(&g_World);
D3DXMatrixLookAtLH(&g_View, &D3DXVECTOR3(0.0f, 0.0f, 0.5f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
D3DXMatrixPerspectiveFovLH( &g_Projection , ((float)D3DX_PI/4.0f), (float)(SCREEN_WIDTH/SCREEN_HEIGHT), 0.01f, 100.0f);

D3DXMatrixTranspose( &cb.mWorld, &g_World);
D3DXMatrixTranspose( &cb.mView , &g_View );
D3DXMatrixTranspose( &cb.mProjection, &g_Projection );

devcon->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb, 0, 0 );

devcon->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);

devcon->VSSetShader(pVS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);

}

devcon->Draw(3, 0);
swapchain->Present(0, 0);



Ich bin dankbar für jegliche Hilfe.


Johannes Schneider
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

26.02.2013, 22:30

Vielleicht verschiebst du das Dreieck ja hinter die Kamera? Oder check mal ob die Daten alle korrekt im Shader ankommen. PIX hilft dir dabei.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.02.2013, 22:46

Woher kommen World, View und Projection? Übergib erstmal Einheitsmatrizen, um zu sehen ob zumindest die Übergabe funktioniert. Mit PIX (bzw. dem Visual Studio Graphics Debugger) solltest du dich auf jeden Fall möglichst schnell vertraut machen. Abgesehen davon solltest du später dann besser nicht drei Matrixmultiplikationen pro Vertex machen, sondern die fertige WoldViewProjection Matrix an den Shader übergeben und eine Multiplikation im Shader machen...

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

4

27.02.2013, 18:06

Danke Leute für die vielen Tips Leute. Es läuft jetzt so wie ich möchte :)
Am liebsten würd ich jetzt sagen "Der Fehler lag einfach darin..." aber da bin ich mir nicht sicher.

Mfg Johannes Schneider.
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

5

04.03.2013, 21:12

wenn du den Constant Buffer veränderst, dann musst du mit Map und Unmap arbeiten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fireball« (04.03.2013, 21:27)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

04.03.2013, 21:39

wenn du den Constant Buffer veränderst, dann musst du mit Map und Unmap arbeiten.


Niemand wird dazu gezwungen!
@D13_Dreinig

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

7

05.03.2013, 22:53

wenn du den Constant Buffer veränderst, dann musst du mit Map und Unmap arbeiten.


Niemand wird dazu gezwungen!


Aber ist es nicht sinnvoller? Ich rufe immer eine SetShaderParameter Methode auf, bevor ist das Objekt dann anzeige.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

05.03.2013, 23:13

wenn du den Constant Buffer veränderst, dann musst du mit Map und Unmap arbeiten.


Niemand wird dazu gezwungen!


Aber ist es nicht sinnvoller? Ich rufe immer eine SetShaderParameter Methode auf, bevor ist das Objekt dann anzeige.


Um den Puffer zu updaten muss man aber nicht zwangsläufig Map/Unmap verwenden. Ich dachte du willst darauf hinaus.
@D13_Dreinig

Werbeanzeige