[D3D10] Vertex-Texturen mit vs_4_0

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

[D3D10] Vertex-Texturen mit vs_4_0

Beitrag von Unknown GER »

Hi Leute,

folgendes Problem: ich möchte im Vertex Shader auf eine Vertex-Textur zugreifen, in der im R32_FLOAT-Format Höhendaten zwischen 0 und 1 für ein Terrain gespeichert sind. Sämtliche HLSL-Beispiele mit Vertex-Texturen, die ich finden konnte, sind jedoch aus der Direct3D9-Zeit (vs_3_0). Sampler States sind nun nicht mehr an Texturen gebunden und z. B. anstatt mit tex2D(...) wird mit [textur].Sample(...) auf Texturen zugegriffen. Im Pixel Shader kann ich so ohne Probleme auf die Textur zugreifen und das platte Terrain zumindest einfärben. Im Vertex Shader meckert der Compiler jedoch:

error X4532: cannot map expression to vs_4_0 instruction set

Die betreffende Zeile im Vertex Shader zur Übersicht vereinfacht:

float y = vertexTexture.Sample(ssVertexTexture, float2(0.0f, 0.0f)).r;

Und hier noch ein paar Zusatzinformation falls benötigt:

Texture2D vertexTexture;
SamplerState ssVertexTexture { Filter = MIN_MAG_MIP_POINT; };

Wie gesagt, die selbe Zeile funktioniert im Pixel Shader. Hilfe! :?
Dirk Schulz
Establishment
Beiträge: 130
Registriert: 01.03.2009, 14:21
Alter Benutzername: frittentuete

Re: [D3D10] Vertex-Texturen mit vs_4_0

Beitrag von Dirk Schulz »

Filterung wird im Vertex Shader nicht unterstützt. (wie auch)

Hier steht, welche Sample-Operationen im VS unterstützt werden:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

Re: [D3D10] Vertex-Texturen mit vs_4_0

Beitrag von Unknown GER »

Ist bekannt, daher MIN_MAG_MIP_POINT. Oder gibt es eine andere Konstante, die für "keine Filterung" steht?

edit: Ah, jetzt seh ichs bei deinem Link. Wird dann wohl auf die Load-Methode hinauslaufen. Danke! :)
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

Re: [D3D10] Vertex-Texturen mit vs_4_0

Beitrag von Unknown GER »

Ich müsste die Funktionalität von text2Dlod() mit vs_4_0-Mitteln nachbilden. Bisher hab ich dafür die Load()-Methode des betreffenden Texture Objects verwendet. Das Problem dabei ist, dass man Load() nicht anweisen kann, die Texturkoordinaten zu wrappen - sehe ich das richtig? Genau das bräuchte ich aber. Zurzeit umgehe ich das, indem ich den sm_3_0-Sampler als sm_4_0-Sampler ohne Texture Object nachbilde (Beispiel folgt). Das tex2Dlod() im Vertex Shader lässt sich jedoch nur mit D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY kompilieren, da ich ansonsten den folgenden Fehler bekomme:
error X3523: DX9-style intrinsics are disabled when not in dx9 compatibility mode.
Geht das nicht eleganter, ohne Kompatibilitätsmodus (Vertex Shader MUSS als vs_4_0 kompiliert werden)? Bestünde die einzige Möglichkeit evtl. darin, die Texturkoordination - die für Load() ja als Integer-Koordinaten angegeben werden müssen - selbst vorher mit einer Modulo-Operation zu wrappen? Die Texturausmaße ließen sich dafür mit GetDimensions() vom Texture Object erfragen.

Hier das Beispiel des angepassten Samplers (erst sm_3_0, dann sm_4_0):

Code: Alles auswählen

sampler elevationMapSampler = sampler_state
{
Texture   = (elevationMap);
MipFilter = None;
MinFilter = Point;
MagFilter = Point;
AddressU  = Wrap;
AddressV  = Wrap;
};

sampler elevationMapSampler
{
Texture = (elevationMap);
Filter = MIN_MAG_MIP_POINT;
AddressU = Wrap;
AddressV = Wrap;
};
Antworten