-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathShader.cpp
More file actions
executable file
·104 lines (86 loc) · 3.41 KB
/
Shader.cpp
File metadata and controls
executable file
·104 lines (86 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Shader.cpp
*
* Created by Jacopo Volpin on 04/05/10.
*
* classe che permette di definire il Phong Shader (o Vertex Shader, illuminazione per pixel). Se abilitata permette una netta differenza
* visibile nell'illuminazione del modello. Rispetto al calcolo della normale per vertice (si prende ogni vertice in comune tra i poligoni
* e si somma la normale di ogni poligono, quindi ottengo una media) in questo caso la normale viene calcolata per pixel, quindi ogni punto
* risponde in maniera differente alla luce. Si ottiene un'illuminazione e risposta più naturale.
*/
#include "Shader.h"
GLchar *SorgenteVertex =
"varying vec3 N;"
"varying vec4 O;" // direzione da cui arriva l'osservatore
"void main()"
"{"
" gl_Position = ftransform();"
" N = gl_NormalMatrix * gl_Normal;" // prendo la normale da GL NORMAL, la rototraslo e la scrivo all'interno di N che è varying (interpolante)
" O = gl_ModelViewMatrix * gl_Vertex;"
"}"
;
GLchar *SorgenteFrag =
"varying vec3 N;"
"varying vec4 O;" // direzione da cui arriva l'osservatore
"void main()"
"{"
" vec4 ca;"
" vec4 cd;"
" vec4 cs;" // COMPONENTE SPECULARE
" vec3 n1;"
" vec3 n2;"
" ca = gl_FrontMaterial.ambient * gl_LightSource[0].ambient ;" // ottengo la luce ambientale
" cd = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse ;" // ottengo la luce diffuse
" cs = gl_FrontMaterial.specular * gl_LightSource[0].specular;" // ottengo la luce speculare
" n1 = normalize(N);"
" n2 = normalize(gl_LightSource[0].position.xyz);"
" cd *= max(dot(n1,n2),0.0);" // se non lo confronto con 0.0 avrei una luce negativa che assorbe la luce ambientale (quindi se non lo metto mi genera la penombra)
" ca += cd;"
" n2 = n2 - normalize(O.xyz);" // ottengo vettore unitario di xyz, e poi con la regola del parallelogramma faccio n2 - normalize(O.xyz)
" n2 = normalize(n2);" // lo normalizzo , ora ho il versore bisettrice, direz media tra da dove proviene la luce e l'osservatore
" float val = max(dot(n1,n2),0.0);"
" cs *= pow(val,64.0);"
" ca += cs;"
" gl_FragColor = ca;"
"}"
;
#define MAX_SHADER_LOG 2048
static GLchar ShaderLog[MAX_SHADER_LOG];
void Shader::vertexShader(){
GLint Ok;
GLint PosTex;
ShaderVertex = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
glShaderSourceARB(ShaderVertex, 1, (const GLchar **) &SorgenteVertex, NULL);
glCompileShaderARB(ShaderVertex);
glGetObjectParameterivARB(ShaderVertex, GL_OBJECT_COMPILE_STATUS_ARB, &Ok);
glGetInfoLogARB(ShaderVertex, MAX_SHADER_LOG, &PosTex, ShaderLog);
if(PosTex > 0){
printf("log vertex : %s\n",ShaderLog);
}
};
void Shader::fragShader(){
GLint Ok;
GLint PosTex;
ShaderFrag = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB(ShaderFrag, 1, (const GLchar **) &SorgenteFrag, NULL);
glCompileShaderARB(ShaderFrag);
glGetObjectParameterivARB(ShaderFrag, GL_OBJECT_COMPILE_STATUS_ARB, &Ok);
glGetInfoLogARB(ShaderFrag, MAX_SHADER_LOG, &PosTex, ShaderLog);
if(PosTex > 0){
printf("log fragment : %s\n",ShaderLog);
}
};
void Shader::linkShader(){
GLint Ok;
GLint PosTex;
ShaderProg = glCreateProgramObjectARB();
glAttachObjectARB(ShaderProg, ShaderVertex);
glAttachObjectARB(ShaderProg, ShaderFrag);
glLinkProgramARB(ShaderProg);
glGetObjectParameterivARB(ShaderProg, GL_OBJECT_LINK_STATUS_ARB, &Ok);
glGetInfoLogARB(ShaderProg, MAX_SHADER_LOG, &PosTex, ShaderLog);
if(PosTex > 0){
printf("log link : %s\n",ShaderLog);
}
};
GLhandleARB Shader::getProgram(){ return ShaderProg; };