.[ ČeskéHry.cz ].
GLSL Světla - problém

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 26. červenec 2011, 11:24:22    Předmět: GLSL Světla - problém Odpovědět s citátem

Ahoj, mám menší problém a vůbec nevím co s ním.

Podle tohoto tutoriálu jsem si udělal shader na světla, ale mám problém. Ať dělám co dělám, tak světlo není na stejném místě. Prostě se hejbe pořád s kamerou. Už sem zkusil pozici světla přenásobovat všemi možnými maticemi a pořád nic.

Světlo nastavuju jako pro FFP, kde to funguje.
kód:
start kreslení
nastavení kamery přes LookAt
nastavení pozice světla


Prosím poraďte mi co dělám blbě. Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 26. červenec 2011, 12:19:59    Předmět: Odpovědět s citátem

Uplne najlepsie spravis, ak do shaderu budes posielat poziciu svetla (na zaciatok a debug!!!) uplne rucne. A sice world poziciu svetla, bez nijakych matic. Na FFP sa v podstate vyser. Ale gluLookAt kludne pouzi, akurat si budes musiet posielat do shaderu i view maticu (pripadne viewProjection), co asi budes musiet i tak.

Potom sa musis sam so sebou dohodnut, v ktorom priestore spocitas osvetlenie (dot(N,L), dot(R, V) atd). Uplne najjednoduchsie to bude zase vo WORLD. Takze potrebujes nasledovne ingrediencie:
1. geometricku poziciu a geometricku normalu v object space (tj tak, ako to vylezie z editora)
2. world a worldInverseTranspose matice pre dany objekt (world matica ho posunie a otoci tam, kde ho potrebujes mat)
3. poziciu svetla (svetiel) vo world space

Potom je to uz takto jednoduche:

kód:
VSOUTPUT VS(VSINPUT inputVS):
  outputVS.worldPos = mul(inputVS.objectPos, uniforms.matWorld);
  outputVS.pos = mul(outputVS.worldPos, matViewProj); // napriklad, toto bude mat "semantiku" gl_Position, pripadne to bude gl_Position
  outputVS.worldNormal = mul(inputVS.objectNormal, uniforms.matWorldIT);

float4 PS(VSOUTPUT inputPS):
  float3 normalizedNormal = normalize(inputPS.worldNormal );  // tzv. "N"
  float3 fragmentToLight = normalize(uniforms.lightPosition, inputPS.worldPos );  // tzv. "L"
  float NdotL = dot(normalizedNormal, fragmentToLight);  // tzv. "lambert"
  ...
  return uniforms.diffuseColor * NdotL + ...; // phong, whatever


Dufam, ze kod je dost zrozumitelny, nechce sa mi hladat GLSL syntax, tak je to taky nejaky HLSL mix Very Happy Uniforms su uniformne premenne citatelne z PS, i VS a obsahuju info o svetle, material, matice, atd.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 26. červenec 2011, 12:41:58    Předmět: Odpovědět s citátem

Tak jsem to vyřešil nakonec ještě jednoduššeji:

kód:
vec4 p = gl_ModelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0);
D = vec3(normalize(gl_LightSource[0].position - p));


Takhle to funguje, tak jak má a já jsem spokojen. Přesto ale díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna