Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 13. říjen 2013, 11:35:56 Předmět: Problém s point světlem v GLSL |
|
|
Ahoj tak mám problém s vykreslením bodového světla přes GLSL. Já ho sice vykreslím, ale vykreslí se podobně jako spot světlo, prostě z toho bodu se vykresluje jedním směrem a né do všech směrů. No když do vertex shaderu pošlu pro normálu pohledovou matici, tedy tak jak vidí kamera tak se světlo natáčí podle kamery. Právě když natočím kamerou do nulté pozice tak světlo už je bodové.
http://img547.imageshack.us/img547/4276/xuy8.jpg |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 13. říjen 2013, 11:56:11 Předmět: |
|
|
A že bys tu třeba ukázal GLSL kódy? My ti poradíme, ale těžko říci takhle podle obrázku... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 13. říjen 2013, 12:21:30 Předmět: |
|
|
Podle obrázku co jsi poslal ti můžu akorát říct - "You're doing it wrong!"
Podle popisu pravděpodobně nevíš v jakém prostoru zrovna pracuješ. Obvykle máš dané modely v jejich Model-Space (e.g. počátek v 0, normály relativně k kartézským osám), světlo ve World-Space (relativně k 0 ve světě).
Osvětlení můžeš provádět v libovolném prostoru - Model Space, World Space, View Space, Tangent Space.
Kameru a světla zadáváš relativně k počátku světla (World Space), modely obvykle k jejich pivotovi (Model Space). Pokud máš počátek v kameře jedná se o View Space. Tangent Space je zvláštní a prozatím bych tě s ním nezatěžoval.
Pokud chceš počítat světlo v Model Space, ztransformuješ kameru i světlo pomocí inverzní World matice objektu (obsahuje pozici a natočení objektu ve světě).
Pokud chceš počítat světlo ve World Space, ztransformuješ body modelů pomocí World matice objektu (tj. pozice a natočení) a jejich vektory (normály) pomocí inverze+transpozice World matice objektu ze které vyjmeš pozici (tedy inverze transpozice 3x3 submatice z ní) - tento typ matice se někdy nazvá Normal matice, obsahuje pouze natočení objektu, jelikož vektory chceš pouze otáčet, nikoliv posouvat.
Pokud chceš počítat světlo ve View Space, musíš vše ztransformovat View maticí (tj. tzv. LookAt matice). Zase platí, že vektory transformuješ pouze inverzní transponovanou 3x3 sub-maticí - jelikož posouvat je je chybné.
Zpravidla nejvýhodnější je používat View Space, jelikož pro rasterizaci stejně potřebuješ spočítat pozice bodů ve View Space (a poté je promítnout projekční maticí).
Toliko k celkovému popisu, když pošleš kód, možná ti někdo na kódu vysvětlí kde děláš chybu - a ne pouze teoreticky tak, jak to píši já. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 13. říjen 2013, 23:05:22 Předmět: |
|
|
Díky Viléme za teorii kterou jsem chtěl spíš vědět, ale jak vidím tak z toho jsem to moc taky nepochopil. Tudíž budu hrozně rád když se mně na to někdo podíváte. Požívám jinak matematickou knižníci GLM.
glm::mat4 Camera::Look()
{
glm::mat4 mTransform;
mTransform = glm::rotate(mIdentity, view[0], glm::vec3(1.0f, 0.0f, 0.0f));
mTransform = glm::rotate(mTransform, view[1], glm::vec3(0.0f, 1.0f, 0.0f));
return mTransform = glm::translate(mTransform, glm::vec3(-position[0], -position[1], -position[2]));
}
glm::mat4 mProjection, mIdentity, mModel, mView, mNormal;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
mProjection = glm::perspective((fovy, aspect, 0.1f, zFar);
mIdentity = glm::mat4(1.0);
mView = kamera.Look();
mModel = glm::mat4(1.0);
spMain.useProgram();
spMain.SetUniform("mProjection", &mProjection);
spMain.SetUniform("mView", &mView);
spMain.SetUniform("mNormal", glm::mat4(1.0f));
spMain.SetUniform("mModel", glm::mat4(1.0f));
model.Render();
vertex sh
layout (location = 0) in vec3 Position;
layout (location = 1) in vec2 TexCoord;
layout (location = 2) in vec3 Normal;
uniform mat4 mProjection;
uniform mat4 mView;
uniform mat4 mModel;
uniform mat4 mNormal;
out vec2 TexCoord0;
out vec3 Normal0;
out vec3 WorldPos0;
void main()
{
gl_Position=mProjection*mView*vec4(Position,1.0); TexCoord0 = TexCoord;
Normal0 = (mNormal * vec4(Normal, 0.0)).xyz;
WorldPos0 = (mModel * vec4(Position, 1.0)).xyz;
}
fragment sh
in vec2 TexCoord0;
in vec3 Normal0;
in vec3 WorldPos0;
uniform sampler2D gSampler;
out vec4 FragColor;
struct PointLight
{
vec3 vColor; // Color of that point light
vec3 vPosition;
float fAmbient;
float fConstantAtt;
float fLinearAtt;
float fExpAtt;
};
uniform PointLight ptLight;
vec4 getPointLightColor(const PointLight ptLight, vec3 vWorldPos, vec3 vNormal)
{
vec3 vPosToLight = vWorldPos-ptLight.vPosition;
float fDist = length(vPosToLight);
vPosToLight = normalize(vPosToLight);
float fDiffuse = max(0.0, dot(vNormal, -vPosToLight));
float fAttTotal = ptLight.fConstantAtt + ptLight.fLinearAtt*fDist + ptLight.fExpAtt*fDist*fDist;
return vec4(ptLight.vColor, 1.0)*(ptLight.fAmbient+fDiffuse)/fAttTotal;
}
void main()
{
vec3 vNormalized = normalize(Normal0);
vec4 vTexColor = texture2D(gSampler, TexCoord0.xy);
vec4 vMixedColor = vTexColor*vColor;
vec4 vPtLightColor = getDirectionalLightColor(sunLight, Normal0)+getPointLightColor(ptLight, WorldPos0, vNormalized);
FragColor = vMixedColor*vPtLightColor;
} |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 27. únor 2014, 17:46:19 Předmět: |
|
|
Sice o dost později odpovídám na svoji otázku kterou jsem vyřešil zhruba 2 týdny potom co jsem to dal sem, ale vyřešeno. Ve fragment shaderu stačilo odstranit tento kod:
kód: |
float fDiffuse = max(0.0, dot(vNormal, -vPosToLight)); |
No a výsledek můžete vidět v mém projektu tady na foru
http://www.ceske-hry.cz/forum/viewtopic.php?t=3658&start=30
Naposledy upravil Mivoj dne 2. březen 2014, 19:29:00, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 2. březen 2014, 18:32:32 Předmět: |
|
|
nie sme na warez fore ze davama linky do code tagu _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
|