Probleme bei Vertex-Pixel Shadern
-
Hi all,
Ich habe Probleme mit Pixel -und VertexShadern.
Ich hab jetzt die Position vom Licht und die Richtung des Lichts im Konstanten Register ( c5, c6 ) gespeichert.
Jetzt will ich von meinem aktuellen Vertex den Lichteinfall berechnen.
Nun berechne ich den Winkel zwischen meinem Lichtvector und meinem Normalenvector und bestimme dadurch den Lichteinfall. Das funktioniert auch.
Jetzt will ich aber die Differenz von meinem Lichtpunkt zum Vertex haben, um eine Maximale reichweite des Lichtes zu bestimmen !
Und Hier scheiter ich.Es gibt zwar eine Instructuon dst. - für ( Distanz ). Aber wenn ich mir die funktionalität anschaue kommt nicht das raus was ich brauche.
Ich brauche ja differenz von zwei vectoren.
Und Die Instruction macht folgendes:
dest.x = 1; dest.y = src0.y * src1.y; dest.z = src0.z; dest.w = src1.w;
Und das kann ich nicht gebrauchen. Dann habe ich versucht per Hand das ganze auszurechnen. Bin aber dann gescheiter bei der Wurzelberechnung ..
WURZEL( x*x+y*y+z*z ).Frage: Gibt es eine Wurzelfunktion ? oder gibt es eine andere Möglichkeit die Differenz zweier Vectoren zu bestimmen ?
Achja ich verwende den Vertex Shader ver.1.1
Nächste Frage:
Ich kann ja in Temp-Registern Vectoren Speichern. Bemerkt der asm auch wenn ich nur eine x-koordinate und etwas anderes ( nur ein float wert ) speicher ?
Bye
-
also du willst die differenz von 2 vektoren ?
wie wäre es dann mitadd dest, src1, -src2 ?
-
Hi,
Jo, Aber nicht den Differenz Vector..
Bye
-
das ist der differenz vector
vecdiff=vec1-vec2
also
wie oben angegebendie länge bekommst du so
sub r1,pos1,pos2 dp3 r1,r1,r1 ; quadratische laenge rsq r2,r1.x ;reciproxe wurzel mul r1,r1,r2 ;division durch die wurzel ... sqrt(x)=x/sqrt(x)
wäre die länge aber wenn du den attentuationfaktor für die quadratische länge benutzt sparrst du dir das wurzelziehen
rapso->greets();
-
Danke
Bye
-
He was ist den überhaupt ein Vertex Sahder???
kenne ich nicht
Habt ihr den nicht vieleicht nur erfunden?
-
Hi,
Noch ne kleien Frage...Warum kann ich nicht mit zahlen in asm arbeiten ?
zb.
rcp r2, 2
funtzt nicht !
Bye
-
du kannst doch keine zahl im pixelshader angeben
, falls du sowas machen möchtest, dann nutze die constant register z.B. def c0,2,2,2,2
r1.x würde ne möglichkeit sein
rapso->greets();
-
Warum nicht `?
-
Warum nicht ?
-
limitierung der gpus
wohl weil die befehllänge zu gross wäre
du müßtest ja sonst 4 floats pro befehl angeben können, und da es risc rechner sind, wäre die codegröße immer gleich, man würde also vielleicht 20byte pro codezeile haben anstatt der jetzigen 4 (soweit ich weiß), und das würde unnütz sein, weil du einfach ein konstantenregitser verwenden kannst, resultiert in dem selben und die sparren vieeele transistoren. (bedenke, 8pipes, immer 128mit mehr, dazu biszu 1024 instructions und eventuell 4transistoren pro bit, wären 4m transistoren mehr bzw. 3% des jetzigen transistor counts.)rapso->greets();
-
Hi,
Naja, ok Schade.Also ich hab gerade versucht, je weiter ein Pixel weg ist, je mehr wird der Pixel mit seiner Farbe multipliziert.. Der Effekt sollte Dunkel-Hell herrauskommen wenn sich die Vertices bewegen(weg,her). Aber das funtzt nicht.
Vielleicht findet ihr ein Fehler..
// Vertex Shader for 1.1 // ************ Register Defines ************************** \\ #define VertexPosition v0 #define VertexNormal v1 #define VertexTexCoord v2 #define VertexColor v3 #define LightVertexDiff r0 #define LightVertexVec r1 #define ProjectionMatrix c0 #define LightPosition c6 #define LightDirection c5 #define AmbientLight c4 // ************ Output Register ************************** \\ #define out_2DVertexPosition oPos #define out_PixelColor0 oD0 #define out_PixelColor1 oD1 #define out_TextureColor0 oT0 #define out_TextureColor1 oT1 #define out_TextureColor2 oT2 #define out_TextureColor3 oT3 #define out_TextureColor4 oT4 #define out_TextureColor5 oT5 #define out_TextureColor6 oT6 #define out_TextureColor7 oT7 vs.1.1 dcl_position0 VertexPosition dcl_normal0 VertexNormal dcl_texcoord0 VertexTexCoord dcl_color0 VertexColor ; project 3d vertex to 2d coord m4x4 out_2DVertexPosition, VertexPosition, ProjectionMatrix sub r1,c6, v0 dp3 r1,r1,r1 ; quadratische laenge rsq r2,r1.x ;reciproxe wurzel mul r1,r1,r2 ;division durch die wurzel ... sqrt(x)=x/sqrt(x rcp r3, r1 mul out_PixelColor0, r3, VertexColor
Bye
-
" Aber das funtzt nicht. " undefined const
bitte definiere das
rapso->greets();
-
HM ?
-
was passiert stattdessen? bzw. welches ergäbniss hast du genau erwartet und wie genau unterscheidet sich das bzw. was siehst du was nicht so sein sollte?
rapso->greets();
-
Die Farbe ist von der Ausgangsfarbe verdunkelt und bleibt konstant.
-
wie gross ist das objekt dass die farbe haben soll? die range der farben geht von 0.f bis 1.f, falls dein objekt also viel größer ist als 1.f (in ausmassen) oder viel kleiner, dann siehst du nicht den 0 bis 1 bereich der den farbverlauf hat.
schau ma auf meine engine hp, da ist ein screenie wie's ausschaut wenn man die position reinschreibt.
dafür hab ich die inverse der objektgröße als const gespeichert (also 1.f/größe) und dann mit dem längenwert jedes punktes multipliziert. (das dann aber im pixelshader und nicht im vertexshader)
vielleicht ist dein objekt nicht hoch im zentrum und hat von vorherein schon werte die die ganze zeit über 1 oder unter 0 sindrapso->greets();
-
Ich hab ein ganz normales viereck ( 2 dreiecke ) :
VERTEX v[4] = { { -1.0f, -1.2f, 0.0f, /*0.0f, 0.0f, -1.0f, /*0.0f, 1.0f,*/ D3DCOLOR_ARGB( 255, 255, 0, 0 ) }, { -1.0f, 1.2f, 0.0f, /*0.0f, 0.0f, -1.0f, /*0.0f, 0.0f,*/ D3DCOLOR_ARGB( 255, 255, 255, 0 ) }, { 1.0f, 1.2f, 0.0f, /*0.0f, 0.0f, -1.0f, /*1.0f, 0.0f,*/ D3DCOLOR_ARGB( 255, 255, 0, 255 ) }, { 1.0f, -1.2f, 0.0f, /*0.0f, 0.0f, -1.0f, /*1.0f, 1.0f,*/ D3DCOLOR_ARGB( 255, 255, 255, 255 ) }, };
Bye
-
und die siehst du beide _ganz_ bloss in der falschen färbung?
rapso->greets();
-
Hi,
Jo, sind beide da. Also ich seh auch die Farben. Nur verdukelt und konstant.