2016-11-26 5 views
0

Sagen, ich habe diese beiden Variablen in meinem Shader:Texturfilter des Set-Shader von C# in monogame

HLSL

texture ModelTexture; 
sampler2D TextureSampler 

Und das ist, wie ich die Textur gesetzt würde:

C#

myEffect.Parameters["ModelTexture"].SetValue(woodTexture); 

Was ist mit dem Sampler? Es gibt keine EffectParameter.SetValue(SamplerState) Überladung aber ich möchte Filter in der Laufzeit ändern. Wie gehe ich vor?

Ich bin mir ziemlich sicher, der Rest des Codes ist in Ordnung, denn wenn ich TextureSampler direkt in HLSL initialisiere, zeichnet es richtig texturierte Objekte.

Edit:

Ich habe versucht, ein SamplerState Objekt in der Graphics Einstellung.

C#

GraphicsDevice.SamplerStates[0] = new SamplerState { Filter = TextureFilter.Linear }; 

HLSL

sampler2D TextureSampler : register(s0); 

Jetzt Texturzuweisung (die 2. Schnipsel sehen) wirft NullReferenceException.

Ich habe auch versucht, wie oben stattdessen die Textur Einstellung von über EffectParameter:

C#

GraphicsDevice.Textures[0] = woodTexture; 

HLSL

texture ModelTexture : register(t0); 

Das Programm kompiliert und ausgeführt, aber die Textur ist nicht geladen (gerendertes Objekt ist schwarz).

Antwort

0

Es ist eine lange Zeit, die ich nicht XNA Framework verwendet habe, aber durch eine einfache Suche in Google I zu diesen Ergebnissen erhalten:

What Is Sampler State?

Sampler Zustand bestimmt, wie Texturdaten Adressierung mit Textur abgetastet Modi, Filterung und Detaillierungsgrad. Verwenden Sie die SamplerState-Klasse, um ein Sampler-Statusobjekt zu erstellen. Legen Sie mithilfe der GraphicsDevice.SamplerStates-Property-Eigenschaft den Sampler-Status für das Grafikgerät fest.

GraphicsDevice.SamplerStates Property

Diese Methode gibt den letzten sampler Zustand, der für die Graphics oder die Standardgraphics sampler Zustand, wenn nicht zuvor eingestellte eingestellt. Programmierbare Shader referenzieren Texturen mit der Sampler-Nummer, die als Index eines GraphicsDevice.Textures gesetzt ist.

Sie müssen also ein SamplerState-Objekt erstellen und es in einem der GraphicsDevice.SamplerStates-Slots festlegen.

+0

Ich habe meine Antwort bearbeitet. –

+0

@ matt-pielat Stellen Sie Ihre Textur mit 'GraphicsDevice.Textures' ein und beziehen Sie sich auf diese in Ihrer Shader-Datei mit' sampler texture: register (s0); 'wobei der Sampler-Index dem Index in der Textur-Sammlung entspricht. Siehe Beispiel von dieser [link] (https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.graphicsdevice.textures.aspx) – MRB

+0

Compiles & läuft, aber das gerenderte Modell ist schwarz. –

0

Sampler-Status werden auf dem Grafikgeräteobjekt oder innerhalb des Shaders selbst festgelegt.