Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



OpenGL - souřadnicový systém

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: OpenGL - souřadnicový systém

Autor: Eosie

19:25:50 29.09.2008

To se určitě neplánuje.

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: frca

19:15:20 29.09.2008

Neplánuje se třeba uživatelsky definovaný clip-space v OpenGL do budoucna? Asi to teď nemá cenu řešit, když to jde jinak, ale zajímá mě to.

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: Eosie

19:01:55 29.09.2008

Ne, od toho je projekční matice, aby to dostala do takových souřadnic, jak to má být v clip-space.

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: frca

17:44:06 29.09.2008

1)
Ještě mám jeden dotaz. Jde o rozdíl mezi tím, když se změní souř. systém pomocí projection a když se změní pomocí modelview matice?

Edit: Už to vím, tak ať to nemusíte zbytečně číst... Zajímavý je jenom bod 2)

Když se stejně ztransformují vrcholy, čekal bych, že se stejně (na stejný souř. systém) ztransformují i normály. Ale není to tak:

[img]http://forum.builder.cz/file.php?108,file=533363[/img]
První obrázek je vlastní proj., druhý je vlastní modelv. matice.
[code]
VS:

varying vec3 normal;

void main()
{
normal = normalize(gl_NormalMatrix*gl_Normal);
gl_Position = ftransform();
}

FS:

varying vec3 normal;

void main()
{
gl_FragColor = vec4(normal.x, normal.y, normal.z, 1);
}
[/code]

Resp. co je vlastně ta gl_NormalMatrix?
Edit: Tak už vím, je to proto, že při transformaci normál se projection matrix vůbec nepoužije.

2)

Ještě jedna věc: OpenGL _má_ defaultní souřadný systém. Ten je daný tím, že ve FS je gl_FragCoord.x prostě vzdálenost od levého okraje obrazovky/okna; podobně s y.
Chtělo by to mít možnost měnit souřadnice té krychle, do které se frustum transformuje, protože právě ta určuje základní orientaci souřadnic. Neplánuje se něco takového do GL 3.0? Třeba něco jako
glSetCoordSystem(GLenum left_to_right_axis, GLenum bottom_to_top_axis, GLenum near_to_far_axis);

přičemž teď je to defaultně glSetCoordSystem(GL_AXIS_X, GL_AXIS_Y, GL_AXIS_MINUS_Z);
Njn, fantazie pracuje...

Díky,
frca

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: frca

17:24:45 29.09.2008

Řešení:
Stačilo změnit defaultní matici, kterou generuje glFrustum:
[code]
( 2n/(r-l) 0 (r+l)/(r-l) 0 )
( 0 2n/(t-b) (t+b)/(t-b) 0 )
( 0 0 (f+n)/(n-f) 2fn/(n-f) )
( 0 0 -1 0 )
[/code]
Na tuto:
[code]
( (r+l)/(r-l) 2n/(r-l) 0 0 )
( (t+b)/(t-b) 0 2n/(t-b) 0 )
( (f+n)/(n-f) 0 0 2fn/(n-f) )
( -1 0 0 0 )
[/code]

Moc jsem to netestoval.

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: Eosie

14:58:44 29.09.2008

frca Napsal:
-------------------------------------------------------
> OK, ale napadá mě jedna věc: Pokud si budu muset
> nadefinovat vlastní funkce pro matice, nebude to
> pomalejší? Měl jsem za to, že vestavěné
> transformace jsou akcelerované.

Všechny maticové operace jsou těžko akcelerované, když se stejně provádí na cpu, proto se taky budou dávat pryč. Maximálně se tam používá nějaký SSE.


> Ještě mě napadá, co teda určuje ten souřadný
> systém? Projekční matice?

Ano, hlavně ta projekce. Jinak taky dost záleží na tom, jestli ty matice máš row-order nebo column-order, GL používá to druhé, proto jsou vzorce matic transponované. S tím taky souvisí pořadí násobení matic. ( (A*B)^T = B^T * A^T )


> To by možná bylo
> nejlepší řešení, protože by stačilo (pro OpenGL
> 2.0) přepsat jenom ji, resp. fci pro její tvorbu.
Viz výše row/column order. Taky se podívej, jak jsou osy orientované v clip-space, podle toho by se měla přizpůsobit ta projekce.


> A jak by v GLSL dopadla proměnná float
> gl_FragDepth; DEFAULT=glFragCoord.z
> ? Musela by se přepisovat na glFragCoord.x? Za
> předpokladu, že to pomocí té projekční matice
> půjde změnit.

Tady už zacházíš celkem daleko. Kdybys totiž do gl_Position.z dal něco jinýho než hloubku, měl bys blbý hodnoty v zbufferu. Ano ruční použití gl_FragDepth to řeší, ale změna aktuální hloubky ve fragment shaderu vypíná celou řadu optimalizací nad zbufferem, takže se ti to jenom zpomalí. Ale jo, šlo by to tak řešit, ovšem v praxi je zbytečné si to takhle komplikovat.

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: frca

20:19:22 28.09.2008

OK, ale napadá mě jedna věc: Pokud si budu muset nadefinovat vlastní funkce pro matice, nebude to pomalejší? Měl jsem za to, že vestavěné transformace jsou akcelerované.
Ještě mě napadá, co teda určuje ten souřadný systém? Projekční matice? To by možná bylo nejlepší řešení, protože by stačilo (pro OpenGL 2.0) přepsat jenom ji, resp. fci pro její tvorbu.
A jak by v GLSL dopadla proměnná
[code]float gl_FragDepth; DEFAULT=glFragCoord.z [/code]
? Musela by se přepisovat na glFragCoord.x? Za předpokladu, že to pomocí té projekční matice půjde změnit.

Díky,
frca

Citovat příspěvek

 

Re: OpenGL - souřadnicový systém

Autor: Eosie

14:54:50 28.09.2008

Abych řekl pravdu, OpenGL nemá žádný defaultní souřadnicový systém. ;) Jediné, co ho určuje, jsou matice, které generuje. Udělej si vlastní funkce glRotatef, glTranslatef, gluPerspective atd., dej si tam vlastní vzorce matic a nic tě nebude omezovat. LHS i RHS tam jede ekvivalentně dobře a vzhledem k tomu, že tyhle maticové funkce jdou z GL pryč, je to už fakt jedno.

Citovat příspěvek

 

OpenGL - souřadnicový systém

Autor: frca

23:43:31 27.09.2008

Dá se nějak v OpenGL předělat souřadnicový systém? Zůstane pravoruký, ale osy budou orientované takto:
[code]*

| z
|
|___ y
/
/ x

[/code]

Jde to pomocí matice:
[code]//*
float modelview_identity_matrix[16] = {
0, 0, 1, 0,
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0, 1,
};
glMultMatrixf(modelview_identity_matrix);
[/code]

Pokud se kód zavolá na začátku po glLoadIdentity, všechno se transformuje podle nového souřadného systému. Problém ale nastává s globálním určením souřadnic např. ve shaderu, kde se samozřejmě zase pracuje s klasickým OpenGL souř. systémem. Vzniká nepěkný guláš dvou typů souřadnic. Není nějaký lepší způsob, jak nadefinovat svůj souřadný systém pro použití v OpenGL aplikaci?
Díky,
frca

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: