.[ ČeskéHry.cz ].
Problém s point světlem v GLSL

 
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
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 13. říjen 2013, 11:35:56    Předmět: Problém s point světlem v GLSL Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 13. říjen 2013, 11:56:11    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 13. říjen 2013, 12:21:30    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 13. říjen 2013, 23:05:22    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 27. únor 2014, 17:46:19    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 2. březen 2014, 18:32:32    Předmět: Odpovědět s citátem

nie sme na warez fore ze davama linky do code tagu
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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