Hey guys. I am very new to OpenGL. I am trying to write a program that just makes a square, with RGB and Black in each corner. I got it to work without using the Z axis at all. Now I am trying to put it into to -10 on the Z axis. My code compiles with no errors, but I get a nice plain green screen as my image instead of a smaller square. Any ideas as to what I am doing wrong?
#include <GL/glfw.h>
//#include <GLES2/gl2.h>
typedef struct {
float position[3];
float color[4];
} Vertex;
const Vertex Vertices[] = {
{{1, -1, -10}, {1, 0, 0, 1}},
{{1, 1, -10}, {0, 1, 0, 1}},
{{-1, 1, -10}, {0, 0, 1, 1}},
{{-1, -1, -10}, {0, 0, 0, 1}}
};
const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0
};
char* vertex_shader_src =
"attribute vec4 Position;
"
"attribute vec4 SourceColor;
"
"uniform mat4 modelView;
"
"uniform mat4 projection;
"
"
"
"varying vec4 DestinationColor;
"
"
"
"void main(void) {
"
" DestinationColor = SourceColor;
"
" gl_Position = projection * modelView * Position;
"
"}
";
char* fragment_shader_src =
"varying lowp vec4 DestinationColor;
"
"
"
"void main(void) {
"
" gl_FragColor = DestinationColor;
"
"}
";
GLint simple_shader(GLint shader_type, char* shader_src)
{
GLint compile_success = 0;
int shader_id = glCreateShader(shader_type);
glShaderSource(shader_id, 1, &shader_src, 0);
glCompileShader(shader_id);
glGetShaderiv(shader_id, GL_COMPILE_STATUS, &compile_success);
if (compile_success == GL_FALSE) {
GLchar message[256];
glGetShaderInfoLog(shader_id, sizeof(message), 0, &message[0]);
printf("glCompileShader Error: %s
", message);
exit(1);
}
return shader_id;
}
int simple_program()
{
GLint link_success = 0;
GLint program_id = glCreateProgram();
GLint vertex_shader = simple_shader(GL_VERTEX_SHADER, vertex_shader_src);
GLint fragment_shader = simple_shader(GL_FRAGMENT_SHADER, fragment_shader_src);
glAttachShader(program_id, vertex_shader);
glAttachShader(program_id, fragment_shader);
glLinkProgram(program_id);
glGetProgramiv(program_id, GL_LINK_STATUS, &link_success);
if (link_success == GL_FALSE) {
GLchar message[256];
glGetProgramInfoLog(program_id, sizeof(message), 0, &message[0]);
printf("glLinkProgram Error: %s
", message);
exit(1);
}
return program_id;
}
GLfloat* make_identity(void){
int i;
int j;
GLfloat* m = malloc(sizeof(float)*4*4);
for(i = 0; i <4; i++){
for(j = 0; j<4;j++){
m[4+i+j] = 0.0;
if(i == j){
m[4+i+j] = 1.0;
}
}
}
return m;
}
GLfloat* make_perspective(GLfloat w, GLfloat h, GLfloat n, GLfloat f){
GLfloat* m = make_identity();
m[0] = (2*n)/w;
m[5] = (2*n)/h;
m[10] = (n+f)/(n-f);
m[11] = (2*n*f)/(n-f);
m[14] = -1;
m[15] = 0;
return m;
}
int main(void)
{
GLint program_id, position_slot, color_slot;
GLuint vertex_buffer;
GLuint index_buffer;
GLuint projection_slot;
GLuint model_slot;
GLfloat* modelView_matrix;
GLfloat* projection_matrix;
// Initialize GLFW library
if (!glfwInit())
return -1;
// Create and open a window
if (!glfwOpenWindow(640, // width
480, // height
8, // red
8, // green
8, // blue
0, // alpha
24, // depth
0, // stencil
GLFW_WINDOW)) //mode
return -1;
program_id = simple_program();
glUseProgram(program_id);
position_slot = glGetAttribLocation(program_id, "Position");
color_slot = glGetAttribLocation(program_id, "SourceColor");
model_slot = glGetUniformLocation(program_id, "modelView");
projection_slot = glGetUniformLocation(program_id, "projection");
glEnableVertexAttribArray(position_slot);
glEnableVertexAttribArray(color_slot);
modelView_matrix = make_perspective(640/640, 480/640, 1, 100);
projection_matrix = make_perspective(640/640, 480/640, 1, 100);
glUniformMatrix4fv(model_slot, 1,0,modelView_matrix);
glUniformMatrix4fv(projection_slot, 1,0,projection_matrix);
// Create Buffer
glGenBuffers(1, &vertex_buffer);
// Map GL_ARRAY_BUFFER to this buffer
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
// Send the data
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
// Repeat
glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
while (glfwGetWindowParam(GLFW_OPENED)) {
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 640, 480);
glVertexAttribPointer(position_slot,
3,
GL_FLOAT,
GL_FALSE,
sizeof(Vertex),
0);
glVertexAttribPointer(color_slot,
4,
GL_FLOAT,
GL_FALSE,
sizeof(Vertex),
(GLvoid*) (sizeof(float) * 3));
glDrawElements(GL_TRIANGLES,
sizeof(Indices) / sizeof(GLubyte),
GL_UNSIGNED_BYTE, 0);
glfwSwapBuffers();
}
return 0;
}