1
+ #include < GL/glew.h>
1
2
#include < GL/glu.h>
2
3
#include < GL/glut.h>
4
+ #include < iostream>
5
+ #include < fstream>
3
6
#include < vector>
4
7
#include < cmath>
5
8
9
+ #define USE_SHADERS 1
10
+ GLuint prog_hdlr;
11
+
6
12
const int SCREEN_WIDTH = 1024 ;
7
13
const int SCREEN_HEIGHT = 1024 ;
8
14
const float camera[] = {.6 ,0 ,1 };
@@ -31,6 +37,56 @@ void change_size(int w, int h) {
31
37
glMatrixMode (GL_MODELVIEW);
32
38
}
33
39
40
+ #if USE_SHADERS
41
+ void printInfoLog (GLuint obj) {
42
+ int log_size = 0 ;
43
+ int bytes_written = 0 ;
44
+ glGetProgramiv (obj, GL_INFO_LOG_LENGTH, &log_size);
45
+ if (!log_size) return ;
46
+ char *infoLog = new char [log_size];
47
+ glGetProgramInfoLog (obj, log_size, &bytes_written, infoLog);
48
+ std::cerr << infoLog << std::endl;
49
+ delete [] infoLog;
50
+ }
51
+
52
+ bool read_n_compile_shader (const char *filename, GLuint &hdlr, GLenum shaderType) {
53
+ std::ifstream is (filename, std::ios::in|std::ios::binary|std::ios::ate);
54
+ if (!is.is_open ()) {
55
+ std::cerr << " Unable to open file " << filename << std::endl;
56
+ return false ;
57
+ }
58
+ long size = is.tellg ();
59
+ char *buffer = new char [size+1 ];
60
+ is.seekg (0 , std::ios::beg);
61
+ is.read (buffer, size);
62
+ is.close ();
63
+ buffer[size] = 0 ;
64
+
65
+ hdlr = glCreateShader (shaderType);
66
+ glShaderSource (hdlr, 1 , (const GLchar**)&buffer, NULL );
67
+ glCompileShader (hdlr);
68
+ std::cerr << " info log for " << filename << std::endl;
69
+ printInfoLog (hdlr);
70
+ delete [] buffer;
71
+ return true ;
72
+ }
73
+
74
+ void setShaders (GLuint &prog_hdlr, const char *vsfile, const char *fsfile) {
75
+ GLuint vert_hdlr, frag_hdlr;
76
+ read_n_compile_shader (vsfile, vert_hdlr, GL_VERTEX_SHADER);
77
+ read_n_compile_shader (fsfile, frag_hdlr, GL_FRAGMENT_SHADER);
78
+
79
+ prog_hdlr = glCreateProgram ();
80
+ glAttachShader (prog_hdlr, frag_hdlr);
81
+ glAttachShader (prog_hdlr, vert_hdlr);
82
+
83
+ glLinkProgram (prog_hdlr);
84
+ std::cerr << " info log for the linked program" << std::endl;
85
+ printInfoLog (prog_hdlr);
86
+ }
87
+ #endif
88
+
89
+
34
90
int main (int argc, char **argv) {
35
91
glutInit (&argc, argv);
36
92
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
@@ -49,6 +105,17 @@ int main(int argc, char **argv) {
49
105
glEnable (GL_LIGHT0);
50
106
glLightfv (GL_LIGHT0, GL_POSITION, light0_position);
51
107
108
+ #if USE_SHADERS
109
+ glewInit ();
110
+ if (GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader && GL_EXT_geometry_shader4)
111
+ std::cout << " Ready for GLSL - vertex, fragment, and geometry units" << std::endl;
112
+ else {
113
+ std::cout << " No GLSL support" << std::endl;
114
+ exit (1 );
115
+ }
116
+ setShaders (prog_hdlr, " shaders/vert_shader.glsl" , " shaders/frag_shader.glsl" );
117
+ glUseProgram (prog_hdlr);
118
+ #endif
52
119
glutMainLoop ();
53
120
return 0 ;
54
121
}
0 commit comments