Skip to content

Commit

Permalink
Add a perspective-corrected box example
Browse files Browse the repository at this point in the history
  • Loading branch information
tene committed Jul 21, 2011
1 parent 127b09d commit b3ccc30
Show file tree
Hide file tree
Showing 5 changed files with 235 additions and 3 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
tri
*.o
.*.sw?
box
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,13 @@ CBLASARGS = -L/usr/lib64/atlas -lcblas
LINKARGS = $(LDFLAGS) $(LD_LOAD_FLAGS) -lGL -lGLU -lGLEW -lglut $(CBLASARGS)
VALGRIND = valgrind --gen-suppressions=all --suppressions=support/opengl.supp --track-origins=yes --leak-check=full --show-reachable=yes

all: tri box

tri: Makefile tri.c utils.c
gcc $(CFLAGS) $(LINKARGS) tri.c -o tri

box: Makefile box.c utils.c glmath.h
gcc $(CFLAGS) $(LINKARGS) box.c -o box

%.valgrind: %
$(VALGRIND) ./$*
202 changes: 202 additions & 0 deletions box.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <stdio.h>
#include <stdlib.h>
#include <jemalloc/jemalloc.h>
#include "utils.c"
#include "glmath.h"

GLuint glprog;

const char *vert_shader_file = "shaders/persp.vert";

const char *frag_shader_file = "shaders/basic.frag";

const float vert_data[] = {
0.25f, 0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,

-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,

-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,

0.25f, 0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -1.25f, 1.0f,
0.25f, 0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,




0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,

0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,

0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,

0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,

0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,

0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,

0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,

0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,

1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,

1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,

0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,

0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
};

GLuint posbuf;
GLuint vao;
GLint offset_unif;
GLint perspec_unif;

void render() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT );

glUseProgram(glprog);

glUniform2f(offset_unif, 0.5f, 0.5f);

size_t color_index = sizeof(vert_data) / 2;
glBindBuffer(GL_ARRAY_BUFFER, posbuf);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void *)color_index);

glDrawArrays(GL_TRIANGLES, 0, 36);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);

glutSwapBuffers();
glutPostRedisplay();
}

void resize(int w, int h) {
h = h ? h : 1;
glViewport(0, 0, w, h);
}

void init() {
GLuint shaders[2];
shaders[0] = load_shader(GL_VERTEX_SHADER, vert_shader_file);
shaders[1] = load_shader(GL_FRAGMENT_SHADER, frag_shader_file);

glprog = create_program(2, shaders);
offset_unif = glGetUniformLocation(glprog, "offset");
perspec_unif = glGetUniformLocation(glprog, "perspective");
mat44f perspec;
perspective_matrix(1.0f, 0.5f, 3.0f, perspec);
for (int i = 0; i<16; i++) {
printf("%2f\n", ((float *)perspec)[i]);
}

glUseProgram(glprog);
glUniformMatrix4fv(perspec_unif, 1, GL_TRUE, (GLfloat *)perspec);
glUseProgram(0);

glGenBuffers(1, &posbuf);
glBindBuffer(GL_ARRAY_BUFFER, posbuf);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert_data), vert_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
}

int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB );

glutCreateWindow("tritest");
glutDisplayFunc(render);
//glutIdleFunc(render);
glutReshapeFunc(resize);

glewInit();
if (!glewIsSupported("GL_VERSION_2_0")) {
printf("OpenGL 2.0 not supported\n");
exit(1);
}

init();

glutMainLoop();

return 0;
}
17 changes: 14 additions & 3 deletions glmath.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
#include <string.h>
#include <GL/glew.h>
#include <cblas.h>
typedef double vec4d[4];
typedef double mat44d[4][4];
typedef GLfloat vec4f[4];
typedef GLfloat mat44f[4][4];

#define mvmul4d(m,v,r) cblas_dgemv(CblasRowMajor, CblasNoTrans, 4, 4, 1.0, (double *)m, 4, (double *)v, 1, 0.0, r, 1);
#define mvmul4f(m,v,r) cblas_dgemv(CblasRowMajor, CblasNoTrans, 4, 4, 1.0, (float *)m, 4, (float *)v, 1, 0.0, r, 1);

void perspective_matrix(float scale, float znear, float zfar, mat44f p) {
memset(p, 0, 16 * sizeof(float));
p[0][0] = scale;
p[1][1] = scale;
p[2][2] = (znear+zfar)/(znear-zfar);
p[3][2] = (2*znear*zfar)/(znear-zfar);
p[2][3] = -1.0f;
}
13 changes: 13 additions & 0 deletions shaders/persp.vert
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
smooth out vec4 gl_Color;

uniform vec2 offset;
uniform mat4 perspective;
void main()
{
vec4 cp = position + vec4(offset.x, offset.y, 0.0, 0.0);
gl_Position = perspective * cp;
gl_Color = color;
}

0 comments on commit b3ccc30

Please sign in to comment.