-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a perspective-corrected box example
- Loading branch information
Showing
5 changed files
with
235 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
tri | ||
*.o | ||
.*.sw? | ||
box |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |