PDA

View Full Version : [SOLVED] [OpenGL] Add perspective projection



bird1500
October 20th, 2012, 11:49 AM
Hi,
Can anyone please add perspective projection into the code below?
I learned how to multiply matrices, vectors, what dot/cross products are, etc except how to setup a perspective projection matrix and use it - just can't get it.



#include <GL/glew.h>
#include <GL/freeglut.h>
#include <stdio.h>

GLuint app, buf;
GLint locPos, locColor;
const GLfloat data[] = {
-0.5f, -0.5f,
1.0f, 0.0f, 0.0f,

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

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

GLuint CreateShaderType(const GLenum type, const GLchar *src, const char *progName) {
GLuint shader = glCreateShader(type);
if(shader == 0) {
return 0;
}

glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);

GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if(status != GL_FALSE) {
return shader;
}

GLint len;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
if(len > 0) {
char *log = new char[len];
glGetShaderInfoLog(shader, len, NULL, log);
const char *szType;
if(type == GL_VERTEX_SHADER) {
szType = "vertex";
} else if(type == GL_FRAGMENT_SHADER) {
szType = "fragment";
} else {
szType = "unknown";
}
printf("Error compiling %s shader of %s: %s\n", szType, progName, log);
delete[] log;
}
glDeleteShader(shader);
return 0;
}

GLuint CreateShader(const GLchar *vertSrc, const GLchar *fragSrc, const char *progName) {
GLuint vertShader = CreateShaderType(GL_VERTEX_SHADER, vertSrc, progName);
if(vertShader == 0) {
return 0;
}

GLuint fragShader = CreateShaderType(GL_FRAGMENT_SHADER, fragSrc, progName);
if(fragShader == 0) {
glDeleteShader(vertShader);
return 0;
}

GLuint prog = glCreateProgram();
glAttachShader(prog, vertShader);
glAttachShader(prog, fragShader);
glLinkProgram(prog);
glDeleteShader(vertShader);
glDeleteShader(fragShader);

GLint status;
glGetProgramiv(prog, GL_LINK_STATUS, &status);
if(status != GL_FALSE) {
return prog;
}

GLint len;
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
if(len > 0) {
char *log = new char[len];
glGetProgramInfoLog(prog, len, NULL, log);
printf("Error linking %s program: %s\n", progName, log);
delete[] log;
}
glDeleteProgram(prog);
return 0;
}

bool
AppSetup() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glGenBuffers(1, &buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

const GLchar *vertSrc =
"#version 330\n"
"in vec2 vPos;\n"
"in vec3 vColor;\n"
"out vec3 vPassColor;\n"
"void main() {\n"
" vPassColor = vColor;\n"
" gl_Position = vec4(vPos, 0.0f, 1.0f);\n"
"}\n";

const GLchar *fragSrc =
"#version 330\n"
"in vec3 vPassColor;\n"
"out vec4 vOutColor;\n"
"void main() {\n"
" vOutColor = vec4(vPassColor, 1.0f);\n"
"}\n";

app = CreateShader(vertSrc, fragSrc, "Main shader");
if(app == 0) {
return false;
}

locPos = glGetAttribLocation(app, "vPos");
locColor = glGetAttribLocation(app, "vColor");


return true;
}

void
WinClose() {
if(app != 0) {
glDeleteProgram(app);
}
}

void
WinDraw() {
glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(app);

glBindBuffer(GL_ARRAY_BUFFER, buf);
glEnableVertexAttribArray(locPos);
glEnableVertexAttribArray(locColor);

glVertexAttribPointer(locPos, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, 0);
glVertexAttribPointer(locColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (void*) (sizeof(GLfloat)*2));

glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(locPos);
glDisableVertexAttribArray(locColor);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glutSwapBuffers();
}

void
WinResize(int w, int h) {
glViewport(0, 0, w, h);
}


int main(int argc, char *argv[]) {

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 500);
glutCreateWindow("GL 3.3");

glutDisplayFunc(WinDraw);
glutReshapeFunc(WinResize);
glutCloseFunc(WinClose);

GLenum status = glewInit();
if(status != GLEW_OK) {
printf("Glew init failed %s\n", glewGetErrorString(status));
return 0;
}

if(!AppSetup()) {
return 0;
}

glutMainLoop();
return 0;
}


EDIT: I'll try out this (http://www.geeks3d.com/20090729/howto-perspective-projection-matrix-in-opengl/) and see if it works.