Skip to content

Commit ebc9594

Browse files
committed
GLSL helloworld
1 parent 006d7a1 commit ebc9594

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
SYSCONF_LINK = g++
22
CPPFLAGS =
33
LDFLAGS =
4-
LIBS = -lm -lGL -lglut -lGLU
4+
LIBS = -lm -lGL -lGLEW -lglut -lGLU
55

66
DESTDIR = ./
77
TARGET = main

main.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
#include <GL/glew.h>
12
#include <GL/glu.h>
23
#include <GL/glut.h>
4+
#include <iostream>
5+
#include <fstream>
36
#include <vector>
47
#include <cmath>
58

9+
#define USE_SHADERS 1
10+
GLuint prog_hdlr;
11+
612
const int SCREEN_WIDTH = 1024;
713
const int SCREEN_HEIGHT = 1024;
814
const float camera[] = {.6,0,1};
@@ -31,6 +37,56 @@ void change_size(int w, int h) {
3137
glMatrixMode(GL_MODELVIEW);
3238
}
3339

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+
3490
int main(int argc, char **argv) {
3591
glutInit(&argc, argv);
3692
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
@@ -49,6 +105,17 @@ int main(int argc, char **argv) {
49105
glEnable(GL_LIGHT0);
50106
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
51107

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
52119
glutMainLoop();
53120
return 0;
54121
}

shaders/frag_shader.glsl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#version 120
2+
3+
varying vec3 n;
4+
5+
void main(void) {
6+
vec3 l = normalize(gl_LightSource[0].position.xyz);
7+
8+
float intensity = .2 + max(dot(l,normalize(n)), 0.0);
9+
10+
if (intensity > 0.95)
11+
intensity = 1;
12+
else if (intensity > 0.5)
13+
intensity = .6;
14+
else if (intensity > 0.25)
15+
intensity = .4;
16+
else
17+
intensity = .2;
18+
19+
gl_FragColor = gl_Color * intensity;
20+
return;
21+
}
22+

shaders/vert_shader.glsl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#version 120
2+
3+
varying vec3 n;
4+
5+
void main() {
6+
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
7+
gl_FrontColor = gl_Color;
8+
n = gl_NormalMatrix * gl_Normal;
9+
}

0 commit comments

Comments
 (0)