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;
}
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