Thanks Groovounet, I wasn’t sure where GLEW was at (GL 4). Having said that I have fallen behind and my GPU is at 3.2 so I haven’t tried any of the GL4 stuff yet. May be time to get a new video card.
Back to the original post – if it helps to get GL3 up and running, I added below two “helloworld” codes to push some gl3 triangles that works on my machine. The first uses freeglut, the second uses SDL if you feel like trying it out. You should see a blue rectangle.
#include <stdio.h>
// Ensure we are using opengl's core profile only
#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>
#include <GL/glut.h>
#include <GL/freeglut_ext.h>
size_t VertexArrayCount; // 3 for {x y z}
GLuint vao;
void initGL() {
//Create shaders and shader program
GLuint vshader(glCreateShader(GL_VERTEX_SHADER));
GLuint fshader(glCreateShader(GL_FRAGMENT_SHADER));
GLuint program(glCreateProgram());
const GLchar *vshader_source[] =
{
"#version 150 core
"
"
"
"in vec3 vert;
"
"
"
"void main() {
"
" gl_Position=vec4(vert,1.);
"
"}
"
"
"
};
glShaderSource(vshader,1,vshader_source,NULL);
const GLchar *fshader_source[] =
{
"#version 150 core
"
"out vec4 fragcolor;
"
"
"
"void main() {
"
"
"
" fragcolor=vec4(0.0f,0.0f,1.0f,0.0f);
"
"}
"
"
"
};
glShaderSource(fshader,1,fshader_source,NULL);
glCompileShader(vshader);
glCompileShader(fshader);
glAttachShader(program,vshader);
glAttachShader(program,fshader);
glLinkProgram(program);
glUseProgram(program);
//Get handles to shader uniforms
//... none for this simple vert/frag shader
//Datas destioned for video memory, can be local (and lost after bound to GPU!).
#define R 0.9
GLfloat vertices[] = { // in vec3 vert;
-R, R, 0.0, // xyz
-R, -R, 0.0,
R, R, 0.0,
R, -R, 0.0
};
VertexArrayCount=sizeof(vertices)/sizeof(GLfloat)/3; // 3 for {x y z}
//Create geometry vertex array using Model definition
//use global GLuint vao;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
//in vec3 vert;
GLuint bon_vert; // buffer object name
glGenBuffers(1,&bon_vert);
glBindBuffer(GL_ARRAY_BUFFER,bon_vert);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*3*VertexArrayCount,vertices,GL_STATIC_DRAW);
const GLint loc_vert(glGetAttribLocation(program,"vert"));
glVertexAttribPointer(loc_vert,3,GL_FLOAT,GL_TRUE,0,NULL);
glEnableVertexAttribArray(loc_vert);
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLE_STRIP,0,VertexArrayCount);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitContextVersion(3,2);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutCreateWindow("gl3.3 freeglut");
printf("OpenGL %s, GLSL %s
", glGetString(GL_VERSION),
glGetString(GL_SHADING_LANGUAGE_VERSION));
initGL();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
#define GL3_PROTOTYPES
#include <GL3/gl3.h> // wget http://www.opengl.org/registry/api/gl3.h
#include <SDL.h>
int main()
{
//SDL Initialization
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2);
SDL_Init(SDL_INIT_VIDEO);
const int r_width(640),r_height(640);
SDL_WindowID window(SDL_CreateWindow("openGL3 HelloWorld",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,r_width,r_height,SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN));
SDL_GLContext glcontext(SDL_GL_CreateContext(window));
//Create shaders and shader program
GLuint vshader(glCreateShader(GL_VERTEX_SHADER));
GLuint fshader(glCreateShader(GL_FRAGMENT_SHADER));
GLuint program(glCreateProgram());
const GLchar *vshader_source[] =
{
"#version 150 core
"
"
"
"in vec3 vert;
"
"
"
"void main() {
"
" gl_Position=vec4(vert,1.);
"
"}
"
"
"
};
glShaderSource(vshader,1,vshader_source,NULL);
const GLchar *fshader_source[] =
{
"#version 150 core
"
"out vec4 fragcolor;
"
"
"
"void main() {
"
"
"
" fragcolor=vec4(0.0f,0.0f,1.0f,0.0f);
"
"}
"
"
"
};
glShaderSource(fshader,1,fshader_source,NULL);
glCompileShader(vshader);
glCompileShader(fshader);
glAttachShader(program,vshader);
glAttachShader(program,fshader);
glLinkProgram(program);
glUseProgram(program);
//Get handles to shader uniforms
//... none for this simple vert/frag shader
//Datas destioned for video memory, can be local (and lost after bound to GPU!).
#define R 0.9
GLfloat vertices[] = { // in vec3 vert;
-R, R, 0.0, // xyz
-R, -R, 0.0,
R, R, 0.0,
R, -R, 0.0
};
size_t VertexArrayCount=sizeof(vertices)/sizeof(GLfloat)/3; // 3 for {x y z}
//Create geometry vertex array using Model definition
GLuint vao;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
//in vec3 vert;
GLuint bon_vert; // buffer object name
glGenBuffers(1,&bon_vert);
glBindBuffer(GL_ARRAY_BUFFER,bon_vert);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*3*VertexArrayCount,vertices,GL_STATIC_DRAW);
const GLint loc_vert(glGetAttribLocation(program,"vert"));
glVertexAttribPointer(loc_vert,3,GL_FLOAT,GL_TRUE,0,NULL);
glEnableVertexAttribArray(loc_vert);
//Render loop
SDL_Event event;
do {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLE_STRIP,0,VertexArrayCount);
SDL_GL_SwapWindow(window);
SDL_PollEvent(&event); //non-blocking
} while (event.type!=SDL_MOUSEBUTTONDOWN);
//Quiting, so cleanup resources
glDeleteProgram(program);
glDeleteShader(fshader);
glDeleteShader(vshader);
glDeleteBuffers(1,&bon_vert);
glDeleteVertexArrays(1,&vao);
SDL_GL_DeleteContext(glcontext);
SDL_DestroyWindow(window);
SDL_Quit();
}