DGL
https://delphigl.com/forum/

Spheremapping
https://delphigl.com/forum/viewtopic.php?f=20&t=4428
Seite 1 von 1

Autor:  Vertex [ Sa Aug 13, 2005 21:44 ]
Betreff des Beitrags:  Spheremapping

Hi!

Ich will Spheremapping von OpenGL in einem VertexProgram nachbilden.

http://wiki.delphigl.com/index.php/GlTexGen (hier fehlt übrigens die Berechnung von m !)

Das ist mein Ansatz
Code:
  1. !!ARBvp1.0
  2.  
  3. PARAM MV[4]    = { state.matrix.modelview };
  4. PARAM MVInv[4] = { state.matrix.modelview.invtrans };
  5. PARAM MVP[4]   = { state.matrix.mvp };
  6.  
  7. TEMP ObjectCoord, EyeCoord, ClippingCoord;
  8. TEMP Normal, EyeNormal, TexCoord;
  9. TEMP Ray, Temp, Reflect;
  10.  
  11. MOV ObjectCoord, vertex.position;
  12. MOV Normal, vertex.normal;
  13.  
  14. DP4 EyeCoord.x, MV[0], ObjectCoord;
  15. DP4 EyeCoord.y, MV[1], ObjectCoord;
  16. DP4 EyeCoord.z, MV[2], ObjectCoord;
  17. DP4 EyeCoord.w, MV[3], ObjectCoord;
  18.  
  19. DP4 ClippingCoord.x, MVP[0], ObjectCoord;
  20. DP4 ClippingCoord.y, MVP[1], ObjectCoord;
  21. DP4 ClippingCoord.z, MVP[2], ObjectCoord;
  22. DP4 ClippingCoord.w, MVP[3], ObjectCoord;
  23.  
  24. DP3 EyeNormal.x, MVInv[0], Normal;
  25. DP3 EyeNormal.y, MVInv[1], Normal;
  26. DP3 EyeNormal.z, MVInv[2], Normal;
  27.  
  28. SUB Ray.xyz, EyeCoord, MV[3];
  29.  
  30. # Normalize Ray
  31. DP3 Ray.w, Ray, Ray;     # Ray.x*Ray.x + Ray.y*Ray.y + Ray.z*Ray.z
  32. RSQ Ray.w, Ray.w;        # 1/Sqrt(Ray.w)
  33. MUL Ray.xyz, Ray, Ray.w; # Ray.x*Ray.w, Ray.y*Ray.w, Ray.z*Ray.w
  34.  
  35. # Reflect = Ray - 2.0 * EyeNormal * dot(Ray, EyeNormal)
  36. DP3 Temp.x, Ray, EyeNormal;  # dot(Ray, EyeNormal)
  37. MUL Temp.x, Temp.x, 2.0;     # dot(Ray, EyeNormal) * 2.0
  38. MUL Temp, EyeNormal, Temp.x; # dot(Ray, EyeNormal) * 2.0 * EyeNormal
  39. SUB Reflect, Ray, Temp;      # Ray - dot(Ray, EyeNormal) * 2.0 * EyeNormal
  40.  
  41. # m = Sqrt(Reflect.x^2 + Reflect.y^2 + (Reflect.z + 1)^2)
  42. MUL Temp.x, Reflect.x, Reflect.x; # Reflect.x^2
  43. MUL Temp.y, Reflect.y, Reflect.y; # Reflect.y^2
  44. ADD Temp.w, Reflect.z, 1.0;       # Reflect.z + 1
  45. MUL Temp.z, Temp.w, Temp.w;       # (Reflect.z+1)^2
  46. ADD Temp.w, Temp.x, Temp.y;       # Reflect.x^2 + Reflect.y^2
  47. ADD Temp.w, Temp.w, Temp.z;       # Reflect.x^2 + Reflect.x^2 + (Reflect.z + 1)^2
  48. RSQ Temp.x, Temp.w;               # 1/Sqrt(Reflect.x^2 + Reflect.x^2 + (Reflect.z + 1)^2)
  49.  
  50. # s = Reflect.x/m + 0.5
  51. MUL TexCoord.x, Reflect.x, Temp.x; # Reflect.x * (1/m)
  52. ADD TexCoord.x, TexCoord.x, 0.5;   # Reflect.x * (1/m) + 0.5
  53.  
  54. # t = Reflect.y/m + 0.5
  55. MUL TexCoord.y, Reflect.y, Temp.x; # Reflect.y * (1/m)
  56. ADD TexCoord.y, TexCoord.y, 0.5;   # Reflect.y * (1/m) + 0.5
  57.  
  58. MOV TexCoord.z, 0.0;
  59. MOV TexCoord.w, 1.0;
  60.  
  61. MOV result.position, ClippingCoord;
  62. MOV result.texcoord, TexCoord;
  63. MOV result.color, vertex.color;
  64.  
  65. END


Zitat:
Es sei u der Einheitsvektor der vom Ursprung zum Polygonvertex(in Eye-Koordinaten) zeigt;

Was ist der Ursprung? Ich habe hier MV[3] genommen, was die Rotationsaxe des Objektes ist. Den Vektor habe ich Ray genannt.

Zitat:
n' sei die aktuelle Normale in Eye-Koordinaten transformiert.

Wie transformiert man den vertexnormal in Eye-Koordinaten? In dem ich vertex.normal mit der ModelView oder mit der invertierten ModelView Matrix multipliziere?

Oder habe ich den Reflexionsvektor berechnen lassen? Den habe ich reflect genannt.

mfg olli

Autor:  Flash [ So Aug 14, 2005 21:46 ]
Betreff des Beitrags: 

Wiki Artikel wurde gerade Komplettiert. Sollte jetzt alles so sein, das du dir was draus nehmen kannst. Feedback is dazu immer gern gesehen. Oder anmelden und selber berichtigen. Das ist noch viel lieber gesehn. ;)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/