Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

CG Shader pocetnik

[es] :: 3D programiranje :: CG Shader pocetnik

[ Pregleda: 2068 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
213.244.208.*

ICQ: 208550327


+14 Profil

icon CG Shader pocetnik22.01.2006. u 00:04 - pre 221 meseci
Najzad! Posle toliko cekanja nove graficke ( tj. celog kompa ) X800GT najzad mogu da koristim shadere ( doduse, ne SM 3.0 ali za sada je i ovo dovoljno).

Poceo sam sa CG-om jer mi je on nekako "najcistiji".

Naravno, tu dolaze i prvi problemi.

Verovatno je neko radio one primere iz nVidijinog Toolkit-a ili neki Simple Lighting tutorial.

Sta je u stvari eyePosition koji se koristi u light shaderima. Da li je to pozicija kamere, mada je u svim tutorijalima stavljaju kao konstantnu vrednost ( npr. (0, 0, 1) ) ( cak stave i da je (0, 0, 0) a u gluLookAt stave (0, 10, 30, ..... ) ). Cini mi se da nije target svetla posto bi ono trebalo da je Point light.

Code:


struct vertex
{
    float4 position : POSITION;
    float4 normal   : NORMAL;
    float4 color0   : COLOR0;
};

struct fragment
{
    float4 position : POSITION;
    float4 color0   : COLOR0;
};

fragment main( vertex IN, 
               uniform float4x4 modelViewProjection,
               uniform float4x4 modelViewInverse,
               uniform float4 eyePosition,
               uniform float4 lightVector )
{
    fragment OUT;

    OUT.position = mul( modelViewProjection, IN.position );
//OUT.position = mul( glstate.matrix.mvp, IN.position );

    // Transform normal from model-space to view-space
    float4 normal = normalize( mul( modelViewInverse, IN.normal ).xyzz );

    // Store normalized light vector
    float4 light = normalize( lightVector );

    // Calculate half angle vector
    float4 eye = eyePosition;
    float4 half = normalize( light + eye );
    
    // Calculate diffuse component
    float diffuse = dot( normal, light );

    // Calculate specular component
    float specular = dot( normal, half );
    specular = pow( specular, 32 );

    // A little ambient color
    float4 ambientColor = float4( 0.2, 0.2, 0.2, 0.2 );

    // White specular
    float4 specularMaterial = float4( 1.0, 0.0, 0.0, 1.0 );

    // Combine diffuse and specular contributions and output final vertex color
    OUT.color0 = diffuse * IN.color0 + specular * specularMaterial + ambientColor;

    return OUT;
}




Takodje, ne razumem zbog cega se pozicija vertexa transformise sa ModelViewProjection matricom? Logicnije mi je (za sada) da to bude potrebno za Fragment shader.

Oguglao sam po netu trazeci primere. Pored www.nVidia.com i www.cgshaders.com nisam nasao vise nikakve tutoriale koji bi mi pomogli da "svarim" ove pocetnicke stvari. Znate li jos neke linkove?


EOF
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.90.*



Profil

icon Re: CG Shader pocetnik22.01.2006. u 02:11 - pre 221 meseci
Proces od vertexa do pixela izgleda ovako:
MV = modelview
PR - projection
VP - viewport

-------- 1 ----------------
vec4 projv = MV * PR * vertex; vertex ce transofmisati u novi vertex u prostoru [-1..1, -1..1, -1..1].
Vertex ima 4 kompoente x,y,z,w. x,y,z znas sta je, a w je homogena koordinata. Pocetni vertex uvek ima w=1.
Ovde se opciono racuna i normala, vertex color, tex coord..

-------- 2 ----------------
sada se radi perspektivno deljenje, tj.
float oow = 1.0/projv.w;
proj.x *= oow;
proj.y *= oow;
proj.z *= oow;

Dobijene vrednosti su i dalje izmedju -1 i 1.

Sada se vrsi tzv. viewport scale, tj, projektovane koordinate se transformisu kroz viewport i dobijaju se ekranske koordinate.
--------------------------


Kada 3 razlicita vertexa prodju kroz ovu racunicu, dobija se 3 temena trougla na ekranu. GPU ce poceti proces rasterizacije, tj popunjavanja trougla pixelima.

Ovako je funkcionisao fixed function pipeline (FFP). Uvodjenjem programabilnog pipeline-a tj. vertex & pixel shadera, programer ima mogucnost da izvede proizvolje transformacije vertexa i pixela (uz neka ogranicenja). Zadatak vertex shadera je da obavi ceo -1- umesto FFP-a. i da rezultat preda -2-. -2- je i dalje fixiran i nije programabilan.

U primeru koji si napisao, eyePosition je prosledjen samo zbog racunanja svetla. Tvoj primer racuna boju vertexa na osnovu ambientalne, difuzne i spekularne komponente.

ambientalna komponenta ne zavisi ni od cega, difuzna zavisi od normale vertexa i vektora od svetla do vertexa, a spekularna zavisi od vektora svetla i vektora pogleda iz kamere

Posto imas ATI-a, preporucio bih ti da odustanes od CG-a jer to je NVidijin proizvod i ne optimizuje bas najbolje za ATI. Probaj GLSL i npr. ShaderDesigner (www.typhoonlabs.com). GLSL je dosta laksi za ucenje.

yooyo
 
Odgovor na temu

[es] :: 3D programiranje :: CG Shader pocetnik

[ Pregleda: 2068 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.