Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 26. červenec 2011, 11:24:22 Předmět: GLSL Světla - problém |
|
|
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 |
|
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 26. červenec 2011, 12:19:59 Předmět: |
|
|
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 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. |
|
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 26. červenec 2011, 12:41:58 Předmět: |
|
|
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. |
|