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 mit

    add dest, src1, -src2 ?
    


  • Hi,

    Jo, Aber nicht den Differenz Vector..

    Bye


  • Mod

    das ist der differenz vector

    vecdiff=vec1-vec2

    also
    wie oben angegeben

    die 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


  • Mod

    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 ?


  • Mod

    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


  • Mod

    " Aber das funtzt nicht. " undefined const

    bitte definiere das 🙂

    rapso->greets();



  • HM ?


  • Mod

    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.


  • Mod

    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 sind 🙂

    rapso->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


  • Mod

    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.


Anmelden zum Antworten