Banda Grafica Programabila
Banda Grafica Programabila
Aplicatie 3D API 3D
UPG
Interfata UPG Asamblare primitive Rasterizare Operatii raster Frame buffer
1
UCP
Vertex shader
Fragment shader
Cg Tipuri de date
Tipuri de date de baza:
32-bit floating point half 16-bit floating point bool Boolean Nu exista tipul int
float struct
Structuri ca in C/C++
2
Cg Tipuri de date
Tipuri de date vector (dimensiune maxima 4):
float4, float3, float2, float1 bool4, bool3, etc Exemplu:
float4 pos;
Operatori vectori/matrici
Crearea vectorilor float4 a = {1.0, 1.0, 0.0, 1.0}; Operatorul swizzle: componentelor unui vector: a = b.xxyy; float2 vec2 = b.yx; float scalar = b.w; float3 vec3 = scalar.xxx; pentru replicarea/rearanjarea //b = (2.0, 3.0, 4.0,1.0) //a = (2.0, 2.0, 3.0, 3.0) // vec2 = (3.0, 2.0) // scalar = 1 //vec3 = (1.0, 1.0, 1.0)
4
Operatori vectori/matrici
Modificarea componentelor unui vector in mod selectiv float4 v1 = {4.0, -2.0, 5.0, 3.0}; float2 v2 = {-2.0, 4.0}; v1.xw = v2; v1.w = 1.0; //v1= (-2.0, -2.0, 5.0, 4.0) //v1= (-2.0, -2.0, 5.0, 1.0)
Operatori vecori/matrici
Operatii pe vectori si matrici: Comparatii (pe componente): +, -, *, /, <, >, == Inmultirea matricilor: float4x4 M; float4 v; mul(M, v); //matrice-vector -> intoarce un vector mul(v, M); //vector-matrice -> intoarce un vector mul(M, N); //matrice matrice -> intoarce o matrice
6
Vectori
11
Parametri de intrare
Parametri variabili: coordonate varf, vectori normala asociati fiecarui varf Parametri uniformi: matricea modelview
12
13
UPG
Interfata UPG Asamblare primitive Rasterizare Operatii raster Frame buffer
14
UCP
Vertex shader
Fragment shader
15
Exemplu
void vertex(float2 position: POSITION, out float4 oposition : POSITION, out float4 ocolor: COLOR) { oposition = float4(position, 0, 1); ocolor = float4(0, 1, 0, 1); } void fragment(float4 color: COLOR, out float4 ocolor: COLOR) { ocolor = color; }
16
Calculul luminii
I = ambientala + difuza + speculara = Ip* ka + Ip* kd * cos() + Ip* ks * cos()n
ka: coeficientul de difuzie a luminii ambientale kd: coeficientul de difuzie a luminii incidente ks: coeficientul de reflexie speculara N: normala la suprafata in P IP: intestatea luminii N L n: coeficient de stralucire
R V
P
18
R V
H=V+L
19
Se transforma pozitia din spatiul obiect in viewport 3D Se calculeaza culoarea unui varf folosind componentele luminii: emisiva, ambientala, difuza, speculara Calculul luminii se realizeaza in spatiul obiect -> usor de implementat
20
Functii oferite de Cg
Functii matematice
abs(x), pow(x, y), exp(x), sqrt(x) cos(x), sin(x), sincos(x, s, c) round(x), ceil(x) cross(A, B), dot(A, B) mul(M, N), mul(M, v), mul(v, M) distance(p1, p2) length(v) normalize(v)
22
Functii geometrice
variabili
P(x,y,z,1) C(r,g,b,a)
23
25
float3 V = normalize(eyePosition - P); float3 H = normalize(L + V); float NHn = pow(max(dot(N, H), 0), n); if (dot(N, L)<= 0) NHn = 0; float3 speculara = Ks * lumina * specularLight;
Parametri de intrare Varful (x, y, z, w) -> POSITION Normala (x, y, z) -> NORMAL
28
parametri de intrare
parametri de iesire
parametri de intrare
parametri de iesire
COLOR DEPTH
30
Fragment shader
Parametri de intrare
Varful (x, y, z, w) -> (x, y, z) Normala (x, y, z) Varful (x, y, z) -> TEXCOORD0 Normala (x, y, z) -> TEXCOORD1
31
variabili
32
variabili
Fragment shader
C(r,g,b,a)
34
uniform float3 ambientala_globala, uniform float3 lumina, uniform float3 poz_lumina, uniform float3 poz_observator, uniform float3 Ke, uniform float3 Ka, uniform float3 Kd, uniform float3 Ks, uniform float n)
35
37
Compilarea in CG
Cg shader
Translatare
Cg Compiler
Offline / runtime
Cg Runtime (cg.lib)
cgGL.lib
OpenGL
Direct 3D
cgD3D.lib
UPG
38
Legatura Cg - OpenGL
#include <Cg/cg.h> #include <Cg/cgGL.h> Creare context
CGContext* context = cgCreateContext();
Creare program
CGProgram* vertexProg = cgCreateProgramFromFile(context, CG_SOURCE, Vertex.cg, profile, Ex_v, NULL); CGprofile profile = cgGLGetLatestProfile(CG_GL_VERTEX); CGprofile profile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
39
Legatura Cg - OpenGL
Incarcare program
cgGLLoadProgram(vertexProg );
Executie program
cgGLEnableProfile(profile) cgGLBindProgram(vertexProg);
Dezactivare profil
cgGLDisableProfile(profile)
40
Bibliografie
41