[DX11] Ohne InputLayout und VertexBuffer rendern

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
RazorX
Establishment
Beiträge: 156
Registriert: 23.12.2010, 14:13
Kontaktdaten:

[DX11] Ohne InputLayout und VertexBuffer rendern

Beitrag von RazorX »

Servus, für simple Debugausgaben oder einfache geometrische Objekte hab ich angefangen die Vertices im Vertexshader per SV_VertexID festzulegen. Mir reichts einfach für jede Stelle im Code wo ich ein Vollbildrechteck benötige (oder vergleichbares) das ganze in einen VertexBuffer packen zu müssen (ist bestimmt ne Designfrage, aber naja). Prinzipiell funktioniert das auch super, ich render momentan Billboards (4 Vertices, Strip) und diese werden ohne Fehler dargestellt. Nun habe ich auch eine simple Debugausgabe für Spotlichtquellen in Form einer Pyramide. Die Pyramide wird mit 5 Vertices und einer Control Point Patchlist generiert, mittels eines Gemoetry-Shader durch ein Strip zu einer Pyramide geformt und die Ausgabe wird korrekt gerendert. Die Debug-Runtime liefert mir jedoch einen Fehler, der meiner Meinung nach Schwachsinn ist.

Kurz beide Draw-Calls (sind meine State-Wrapper-Klassen, Funktionsweise sollte klar sein):

Code: Alles auswählen

// Punktlichter
states::input_assembler_stage(context)
	.setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP)
	.setLayout(nullptr)
	.setVertexBuffers(0, nullptr, 0, 0);
context->DrawInstanced(4, 512, 0, 0);

// Spotlichter
states::input_assembler_stage(context)
	.setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST)
	.setLayout(nullptr)
	.setVertexBuffers(0, nullptr, 0, 0);
context->DrawInstanced(5, 512, 0, 0);
Fehlermeldung:
D3D11 ERROR: ID3D11DeviceContext::DrawInstanced: Rasterization Unit is enabled (PixelShader is not NULL or Depth/Stencil test is enabled and RasterizedStream is not D3D11_SO_NO_RASTERIZED_STREAM) but the input topology is Patch Control Points. You need either a Hull Shader and Domain Shader, or a Geometry Shader. [ EXECUTION ERROR #349: DEVICE_DRAW_INPUTLAYOUT_NOT_SET]
Signatur des Vertex Shader:

Code: Alles auswählen

void vs_debug_spotlight(in uint vertexID : SV_VertexID, in uint instanceID : SV_InstanceID, out vs_spotlight_output output) {
Die selbe Eingabesignatur verwende ich ohne Probleme auch bei den Billboards. Wie gesagt, wird die Pyramide korrekt gerendert, bedeutet es ist ein Geometry-Shader gesetzt. Der Vertex-Shader besitzt keine Vertex bezogenen Eingabeparameter, demnach ist es valide ein null InputLayout zu setzen und dementsprechend keinen Vertex-Buffer zu binden. Kann jemand sich einen Reim auf diese Fehlermeldung machen?

Mit freundlichem Gruß,
RazorX
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX11] Ohne InputLayout und VertexBuffer rendern

Beitrag von dot »

Wie sieht die Signatur des GeometryShader aus?
RazorX
Establishment
Beiträge: 156
Registriert: 23.12.2010, 14:13
Kontaktdaten:

Re: [DX11] Ohne InputLayout und VertexBuffer rendern

Beitrag von RazorX »

Eigentlich nichts besonderes:

Code: Alles auswählen

void gs_debug_spotlight(in InputPatch<vs_spotlight_output, 5> pt, inout TriangleStream<vs_spotlight_output> stream) {
Falls noch die Frage aufkommen sollte wie die struct definiert ist:

Code: Alles auswählen

struct vs_spotlight_output {
	float4 _svPosition 	: SV_POSITION;
	float3 _color		: TEXCOORD0;
};
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX11] Ohne InputLayout und VertexBuffer rendern

Beitrag von dot »

Ok, sieht gut aus, das ist merkwürdig. Und die Shader werden alle problemlos kompiliert und die entsprechenden Objekte erzeugt?
RazorX
Establishment
Beiträge: 156
Registriert: 23.12.2010, 14:13
Kontaktdaten:

Re: [DX11] Ohne InputLayout und VertexBuffer rendern

Beitrag von RazorX »

Jau, keine Fehler oder Warnungen. Wie gesagt die Spotlicht-Pyramiden werden auch gerendert, also sind alle drei Shader vorhanden und gesetzt (ohne den Geometry shader würde ich aus dem ControlPointPatch auch einfach keine Dreiecke bekommen).
Antworten