2 Stimmen

Normalisierung eines Vektorfehlers in HLSL

Ich habe diesen ersten Beitrag komplett umgeschrieben, um das Problem besser darzustellen.

Ich verwende ps v1.4 (die höchste Version, für die ich Unterstützung habe) und erhalte ständig einen Fehler.
Es passiert immer dann, wenn ich irgendeine Funktion wie cos, dot, distance, sqrt, normalize etc. auf etwas anwende, das an den Pixelshader übergeben wurde.
Ich muss zum Beispiel "normalize(LightPosition - PixelPosition)" ausführen, um ein Punktlicht in meinem Pixelshader zu verwenden, aber normalize gibt mir einen Fehler.
Einige Dinge zu beachten.
Ich kann Dinge wie pow, abs und radians ohne Fehler verwenden.
Es liegt nur dann ein Fehler vor, wenn dies mit etwas geschieht, das vom Vertex-Shader übergeben wird. (Zum Beispiel könnte ich das sqrt einer lokalen Pixelshader-Variable ohne Fehler nehmen)
Ich erhalte den Fehler, wenn ich eine Funktion für JEDE übergebene Variable ausführe, auch für Textkoordinaten, Farbe usw.
Innerhalb der Vertex-Shader kann ich alle diese Funktionen auf alle Variablen in ohne Fehler übergeben tun, es ist nur in der Pixelshader, dass ich einen Fehler erhalten
Alle Werte, die vom Vertex-Shader an den Pixel-Shader weitergegeben werden, sind korrekt, denn wenn ich die Software-Verarbeitung statt der Hardware verwende, erhalte ich keine Fehler und eine perfekt beleuchtete Szene.
Da die Normalisierung des Vektors ist im Wesentlichen, wo mein Fehler kommt Form, die ich versucht, meine eigene Normalisierung Funktion erstellen.
Ich rufe Norm(LightPosition - PixelPosition) auf und "Norm" sieht so aus -

float3 Norm(float3 v)
{
    return v / sqrt(dot(v, v));
}

Ich erhalte immer noch den Fehler, weil ich schätze, technisch bin ich immer noch versuchen, ein sqrt innerhalb der Pixelshader zu nehmen.

Der Fehler ist nichts Besonderes, es sagt nur "Fehler in der Anwendung" in der Zeile, in der ich meine .fx-Datei in C# lade
Ich denke, es könnte tatsächlich ein Kompilierungsfehler sein, weil ich so alte Versionen verwenden muss (vs 1.1 und ps 1.4)
Beim Debuggen mit fxc.exe bekomme ich die Meldung "can not map instruction to pixel shader instruction set".

1voto

Valmond Punkte 2730

Alte GPUs unterstützten nicht immer alle Befehle, insbesondere im Pixelshader.

Sie könnten mit einem sqrt im Vertex-Shader auskommen, aber für eine so alte Version (1.1 !!) könnte der Fragment-Shader extrem eingeschränkt sein.

D.h. es handelt sich möglicherweise nicht um einen Fehler.

Der Workaround könnte sein, die hlsl zu überspringen und schreiben Sie Ihre eigenen Assembler (aber Sie könnten auf das gleiche Problem dort stolpern) und simulieren die sqrt (sagen Sie mit einer Textur Lookup und / oder Interpolationen, wenn Sie 2 Texturen in 1.0 haben können :-p )

Sie können natürlich versuchen, eine sqrt-Lookup/Interpolation in hlsl zu schreiben, aber es könnte auch zu groß sein (ich erinnere mich nicht, aber IIRC 1.1 lassen Sie nicht sehr lange Shader schreiben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X