DirectX 11 Instancing Shader

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
BlackArma
Beiträge: 12
Registriert: 06.02.2014, 15:10

DirectX 11 Instancing Shader

Beitrag von BlackArma »

Moin Moin alle zusammen.

Nach einem längeren Zeitraum habe ich mir mal wieder Zeit genommen um mich mit DirectX 11 auseinander zu setzten, das mach ich mit dem Buch "Introduction to 3D Game Programming with Directx 11" von Frank Luna. Nun wollte ich simples Instancing implementieren, ohne Beleuchtung und weiters. Auf seiten von DirectX war alles ziemlich schnell gemacht und den Shader, der im Buch verwendet wird, habe ich auf alles notwendig reduziert. Zuerst wollte ich ein 5 * 5 * 5 Feld an instanzierten Würfeln rendern, was auch auf den ersten Blick funktioniert, doch aus irgend einem Grund werden die Innenseiten der Würfel mit der Textur gerendert. Hier ein Bild:

Bild

Und das ist der Shader:

Code: Alles auswählen

//=============================================================================
// InstancedBasic.fx
//
// Basic instanced shader
//=============================================================================

Texture2D gDiffuseMap;
SamplerState gTextureSampler;

cbuffer cbPerObject
{
	float4x4 gViewProj;
}; 

struct VertexIn
{
	float3 PosL     			: POSITION;
	float2 Tex      			: TEXCOORD;
	row_major float4x4 World  	: WORLD;
	uint InstanceId 			: SV_InstanceID;
};

struct VertexOut
{
	float4 PosH    : SV_POSITION;
    float3 PosW    : POSITION;
	float2 Tex     : TEXCOORD;
};

VertexOut VS(VertexIn vin)
{
	VertexOut vout;
	
	vout.PosW    = mul(float4(vin.PosL, 1.0f), vin.World).xyz;
	vout.PosH = mul(float4(vout.PosW, 1.0f), gViewProj);
	vout.Tex = vin.Tex;
	
	return vout;
}
 
float4 PS(VertexOut pin) : SV_Target
{
	return gDiffuseMap.Sample( gTextureSampler, pin.Tex );
}

technique11 Color
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_5_0, VS() ) );
		SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS() ) );
    }
}
Ich habe, um ehrlich zu sein, keine Ahnung woran es sonst liegen könnte da ich bisher von HLSL und der Mathematik dahinter wenig Plan habe da ich, wie gesagt, mich erst mal wieder in die Thematik einarbeiten muss. Falls ihr noch mehr Code braucht einfach bescheid geben.

MfG BlackArma
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: DirectX 11 Instancing Shader

Beitrag von Krishty »

Backface Culling verkehrt herum?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
BlackArma
Beiträge: 12
Registriert: 06.02.2014, 15:10

Re: DirectX 11 Instancing Shader

Beitrag von BlackArma »

Habe ich mir auch gedacht, aber woher könnte das kommen? Den Code was das angeht habe ich gar nicht angefasst.
Wenn ich den CullMode von D3D11_CULL_BACK zu D3D11_CULL_NONE ändere passt es zwar, fühlt sich aber irgendwie nicht wie die richtige Lösung an.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: DirectX 11 Instancing Shader

Beitrag von Krishty »

Garnicht mehr cullen ist natürlich auch falsch, denn du willst ja, dass die GPU sich mit den (unsichtbaren) Innenseiten erst garnicht beschäftigt. Wenn es vorher …_CULL_CCW war, mach jetzt …_CW, oder umgekehrt.

Warum es nicht sofort geht, kann ich dir nicht sagen, weil ich das Buch nicht kenne. Hast du den *kompletten* Code vom Buch übernommen? Falls nicht: Es wäre z.B. auch möglich, dass deine Projektionsmatrix in X oder Y gespiegelt ist. Dadurch würde sich die Dreiecksreihenfolge ebenfalls umkehren.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
BlackArma
Beiträge: 12
Registriert: 06.02.2014, 15:10

Re: DirectX 11 Instancing Shader

Beitrag von BlackArma »

Okay. Ich habe denn CullMode nun mal zu D3D11_CULL_FRONT geändert und es schein alles zu passen.

Ich habe nicht alles komplett kopiert, zuerst habe ich mir eine Struktur geschaffen die mir gefällt bzw. dynamischer ist und dann den Code Stück für Stück aus dem Buch übernommen.So wie ich den Code gerade verwende habe ich zuvor auch schon gerendert, nur ohne Instancing, und da hat alles gepasst. Aber ich werde mir mal, wie du gesagt hast, die Projektionsmatrix anschauen, vielleicht habe ich da irgendwo den Bock geschossen.
Zuletzt geändert von BlackArma am 24.07.2015, 15:48, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: DirectX 11 Instancing Shader

Beitrag von Krishty »

Beachte auch, dass man in der D3D11_RASTERIZER_DESC zwei Werte setzt um die Dreiecksrichtung festzulegen – CullMode und FrontCounterClockwise. Vielleicht ist letzteres falsch herum.

(Der Grund für die doppelte Einstellung sind, schätze ich, Stencil Shadows, wo man für Vorder- und Rückseite unterschiedliche Aktionen durchführt.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten