Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Grafică » Simple terrain texturing




Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 06 Dec 2008 18:16:40    Subiect: Simple terrain texturing
Deliverance info:

Deliverance:

Am generat si rasterizat un heightmap cu succes. As vrea sa aplic ca textura imaginea grayscale ce am obtinut-o initial, astfel incat zonele mai adanci sa fie mai intunecate si cele mai inalte sa fie mai deschise la culoare. Metoda curenta pe care o folosesc pentru calcularea coordonatelor de textura nu functioneaza si anume:

Cod sursă:

float s = float(iAlongX) / float(terrainSize-1);
float t = float(jAlongZ) / float(terrainSize-1);
 


Ar trebui modificat ceva la generarea acestor coordonate dar nu prea inteleg ce...

Trimiterea informatiilor spre gpu se face asa:

Cod sursă:

for (int i=0; i)
     for (int j=0; j)    
    {
             RenderVertex(i, height[i][j], j);
             RenderVertex(i+1, height[i+1][j], j);
             RenderVertex(i+1, height[i+1][j+1], j+1);
             RenderVertex(i, height[i][j+1], j+1);
    }
 


Daca folosesc culori pentru fiecare punct totul este okay, dar as vrea sa pot aplica si textura corect, avand in vedere ca voi vrea sa adaug mai mult detaliu texturii in viitor.

Ultima editare efectuată de Deliverance pe 06 Dec 2008 18:18:47; 3 editări în total


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 06 Dec 2008 18:39:28    Subiect: < fara subiect >
Rimio info:

Rimio:

Ce nu merge bine? Ce face RenderVertex? Nu suntem ghicitoare, sa stii Smile...

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 
    Postat la 06 Dec 2008 19:06:46    Subiect: Re:
Deliverance info:

Deliverance:

Rimio a scris:

Ce nu merge bine? Ce face RenderVertex? Nu suntem ghicitoare, sa stii Smile...


Textura este mapata incorect pe teren astfel incat si unele din partile mai inalte sunt intunecate, iar RenderVertex face ce face si glVertex


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 06 Dec 2008 20:01:51    Subiect: < fara subiect >
Dark info:

Dark:

Coordonatele par sa fie corecte, dar ce vrei tu sa faci n-are nici un sens. De exemplu un plan perfect plat la y = 0 va fi in bezna, pe cind acelasi plan la y = 100 va luci ca-n povesti. In realitate ambele ar trebui sa fie iluminate la fel, ca soarele nu-i un amarit de bec care se pierde de tot daca-l muti 100 de metri. Se pot da nenumarate exemple in care ce vrei tu sa faci nu functioneaza; de fapt imi vine greu sa cred ca exista vreun caz practic in care poti obtine ceva credibil cu abordarea asta.

In plus fata de asta, prin definitie heightmap-ul original are un pixel per vertex din teren, deci nici n-ai nevoie sa folosesti textura aia, ca doar ai deja valorile sub forma de y in vertex. Da y-ul curent la pixel shader printr-un interpolator, iar in pixel shader inmulteste ce-ti vine in interpolatoru' ala cu culoarea curenta. Este exact acelasi lucru cu a folosi o textura pentru a modula iluminarea. Evident, asta teoretic vorbind, deoarece efectul tot degeaba va fi, dupa cum am explicat in primul paragraf.

Ce doresti tu sa faci se numeste ambient occlusion, si nu se face asa. Se aproximeaza cit din cer se vedere de la fiecare vertex (daca vrei sa aplici efectul per-vertex) sau la fiecare texel dintr-o textura aplicata pe teren (daca vrei sa ai rezolutie mai buna, desi probabil pentru teren n-ai de ce sa vrei). Ca sa aproximezi cit din cer se vede, trasezi niste raze de la fiecare vertex/texel inspre cer si faci o proportie intre cite au ajuns la cer si cite ai tras in total. Exista nspe milioane de chestii pe care le poti face pentru a imbunatati acuratetea procesului (sampling destept, nu random, de exemplu) sau viteza lui (poti accelera pe GPU cu occlusion queries, GPU raytracing sau alte alea), dar ideea de baza ramine aceeasi. Vezi ca exista si o multime de solutii gata facute pentru asa ceva, inclusiv ca poti sa faci bake la AO pentru orice mesh cu mental ray in Max/Maya/XSI/whatever.

Ultima editare efectuată de Dark pe 06 Dec 2008 20:03:11; 1 editări în total

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 06 Dec 2008 20:59:25    Subiect: < fara subiect >
Rimio info:

Rimio:

Cauta EarthSculptor. E un editor destul de marfa pentru terrain si, pe langa heightmap, iti proceseaza lightmap, detailmap si tot felul de minuni Wink. In felul asta o sa ai si tu o iluminare corecta fara un dram de munca in plus.

Ultima editare efectuată de Rimio pe 06 Dec 2008 20:59:57; 1 editări în total

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 
    Postat la 06 Dec 2008 21:10:07    Subiect: Re:
Deliverance info:

Deliverance:

Dark a scris:

Coordonatele par sa fie corecte, dar ce vrei tu sa faci n-are nici un sens. De exemplu un plan perfect plat la y = 0 va fi in bezna, pe cind acelasi plan la y = 100 va luci ca-n povesti. In realitate ambele ar trebui sa fie iluminate la fel, ca soarele nu-i un amarit de bec care se pierde de tot daca-l muti 100 de metri. Se pot da nenumarate exemple in care ce vrei tu sa faci nu functioneaza; de fapt imi vine greu sa cred ca exista vreun caz practic in care poti obtine ceva credibil cu abordarea asta.

In plus fata de asta, prin definitie heightmap-ul original are un pixel per vertex din teren, deci nici n-ai nevoie sa folosesti textura aia, ca doar ai deja valorile sub forma de y in vertex. Da y-ul curent la pixel shader printr-un interpolator, iar in pixel shader inmulteste ce-ti vine in interpolatoru' ala cu culoarea curenta. Este exact acelasi lucru cu a folosi o textura pentru a modula iluminarea. Evident, asta teoretic vorbind, deoarece efectul tot degeaba va fi, dupa cum am explicat in primul paragraf.

Ce doresti tu sa faci se numeste ambient occlusion, si nu se face asa. Se aproximeaza cit din cer se vedere de la fiecare vertex (daca vrei sa aplici efectul per-vertex) sau la fiecare texel dintr-o textura aplicata pe teren (daca vrei sa ai rezolutie mai buna, desi probabil pentru teren n-ai de ce sa vrei). Ca sa aproximezi cit din cer se vede, trasezi niste raze de la fiecare vertex/texel inspre cer si faci o proportie intre cite au ajuns la cer si cite ai tras in total. Exista nspe milioane de chestii pe care le poti face pentru a imbunatati acuratetea procesului (sampling destept, nu random, de exemplu) sau viteza lui (poti accelera pe GPU cu occlusion queries, GPU raytracing sau alte alea), dar ideea de baza ramine aceeasi. Vezi ca exista si o multime de solutii gata facute pentru asa ceva, inclusiv ca poti sa faci bake la AO pentru orice mesh cu mental ray in Max/Maya/XSI/whatever.


As vrea sa folosesc textura respectiva pentru a colora procedural terenul.
Pentru inceput am zis sa fac sa mearga lucrurile doar cu imaginea gray-scale. Apoi as putea sa determin pentru un punct apartenenta la o anumita categorie de forma de relief: apa, nisip, campie, deal, munte.
Am de facut programelul asta pentru scoala unde mi s-a dat ca tema studierea fractalilor stochastici(adica aleatori). M-am mai confruntat cu problema asta, de mapare a texturii incorect pe un teren si m-am gandit sa-i dau de capat once and for all...


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 07 Dec 2008 11:06:35    Subiect: Re: Simple terrain texturing
pin46 info:   [banned]

pin46:

Deliverance a scris:

Am generat si rasterizat un heightmap cu succes. As vrea sa aplic ca textura imaginea grayscale ce am obtinut-o initial, astfel incat zonele mai adanci sa fie mai intunecate si cele mai inalte sa fie mai deschise la culoare. Metoda curenta pe care o folosesc pentru calcularea coordonatelor de textura nu functioneaza si anume:

Cod sursă:

float s = float(iAlongX) / float(terrainSize-1);
float t = float(jAlongZ) / float(terrainSize-1);
 


Ar trebui modificat ceva la generarea acestor coordonate dar nu prea inteleg ce...

Trimiterea informatiilor spre gpu se face asa:

Cod sursă:

for (int i=0; i)
     for (int j=0; j)    
    {
             RenderVertex(i, height[i][j], j);
             RenderVertex(i+1, height[i+1][j], j);
             RenderVertex(i+1, height[i+1][j+1], j+1);
             RenderVertex(i, height[i][j+1], j+1);
    }
 


Daca folosesc culori pentru fiecare punct totul este okay, dar as vrea sa pot aplica si textura corect, avand in vedere ca voi vrea sa adaug mai mult detaliu texturii in viitor.


Presupun ca RenderVertex cheama functia din shader. Cum faci iterarea cu codu ala? Eu is obisnuit cu (int i =0; i < valMax; i++)?

Ar putea fi folositor sa postezi un screenshot la texturare si heightmapu.

Ultima editare efectuată de pin46 pe 07 Dec 2008 11:08:12; 1 editări în total



Status:
Înregistrat pe:
06 Aug 2007 23:02:05
Vârsta: ? ani
Mesaje: 683
Locatie: Moldova
PR & Marketing

 
    Postat la 08 Dec 2008 20:15:03    Subiect: Re: Re: Simple terrain texturing
Deliverance info:

Deliverance:

pin46 a scris:

Deliverance a scris:

Am generat si rasterizat un heightmap cu succes. As vrea sa aplic ca textura imaginea grayscale ce am obtinut-o initial, astfel incat zonele mai adanci sa fie mai intunecate si cele mai inalte sa fie mai deschise la culoare. Metoda curenta pe care o folosesc pentru calcularea coordonatelor de textura nu functioneaza si anume:

Cod sursă:

float s = float(iAlongX) / float(terrainSize-1);
float t = float(jAlongZ) / float(terrainSize-1);
 


Ar trebui modificat ceva la generarea acestor coordonate dar nu prea inteleg ce...

Trimiterea informatiilor spre gpu se face asa:

Cod sursă:

for (int i=0; i)
     for (int j=0; j)    
    {
             RenderVertex(i, height[i][j], j);
             RenderVertex(i+1, height[i+1][j], j);
             RenderVertex(i+1, height[i+1][j+1], j+1);
             RenderVertex(i, height[i][j+1], j+1);
    }
 


Daca folosesc culori pentru fiecare punct totul este okay, dar as vrea sa pot aplica si textura corect, avand in vedere ca voi vrea sa adaug mai mult detaliu texturii in viitor.


Presupun ca RenderVertex cheama functia din shader. Cum faci iterarea cu codu ala? Eu is obisnuit cu (int i =0; i < valMax; i++)?

Ar putea fi folositor sa postezi un screenshot la texturare si heightmapu.


Am rezolvat, dar am fost ocupat zilele astea cu alte minuni si n-am mai apucat sa dau un raspuns mai detaliat . Lucrurile stau cam asa: codul care calcula coordonatele de textura trebuia sa fie scris astfel:

float s = float(iAlongZ) / float(terrainSize-1);
float t = float(jAlongX) / float(terrainSize-1);

Va sa zica am inversat putin lucrurile... dar de ce? Heightmapul pentru teren era obtinut dintr-un plasma fractal si nu avea nici un fel de post-procesare care sa roteasca imaginea, care reprezinta outputul algoritmului, in vreun fel.
Fiecarui vertex din terrain ii corespunde o valoare de inaltime in imaginea noastra. Din punct de vedere al memoriei datele pentru teren sunt asezate in acelasi fel ca pentru cele din imagine(stocata deocamdata in RAM). Va sa zica lui teren(i,j) ii va corespunde imagine(i,j). Dar cand eu stochez imaginea in VRAM, deci o fac textura... se schimba modul de accesare a acesteia. Se stie ca texturile in OpenGL au originea in stanga jos. Va sa zica de aici venea problema... dar cum se rezolva? In cel putin 2 moduri. Cand parcurgeam terenul cu indexul i accesam linia i(deci pe axa OY) si cu indexul j accesam coloana j(deci pe axa OX), pe cand cu s accesam "coloana" s si cu t accesam "linia" t. Va sa zica tot ce am de facut este sa schimb i cu j si rezolv problema. Va sa zica primul mod, schimba metoda initiala de a calcula coordonatele de textura. Pot insa sa nu fac acest lucru si totusi codul meu initial de calculare s-urilor si t-urilor sa mearga... cum?! rotind imaginea cu 90 de grade...

Iata ce am obtinut:

Nori fara culoare
http://www.freeimagehosting.net/uploads/5f4347999f.jpg

"Plasma"
http://www.freeimagehosting.net/uploads/ddb5f404a4.jpg

3D Terrain
http://www.freeimagehosting.net/uploads/5fa76ccaa6.jpg

Ultima editare efectuată de Deliverance pe 08 Dec 2008 20:18:43; 3 editări în total


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 07:14:58 24.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved