My aim was to write the simplest possible OpenGL program with custom shaders that uses none of the deprecated functionality and can be run using mesa7.7.1 (i.e. OpenGL 2.1 and GLSL 1.2).
My problem is that nothing gets actually drawn to the window (it’s just cleared using a blue color).
Compiling and linking the shaders works fine.
I guess there’s something wrong about the buffers which causes that no geometry is sent to the shaders, so here’s a shortened version of the file:
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glut.h>
GLuint vertexLoc; //location of vVertex attribute
GLuint vertexArray; //vertex buffer
GLuint vao; //vertex array object
GLuint prog; //Handle to shader prog
void RenderScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLfloat vColor[] = { 0.8, 0.7, 0.1, 1.0 };
glUseProgram(prog);
glUniform4fv(glGetUniformLocation(prog, "vColor"), 1, vColor);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glutSwapBuffers();
}
void SetupRC() {
glClearColor(0.0, 0.0, 1.0, 1.0);
/* Load and compile shaders here */
GLfloat verts[] = { -0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
0.0, 0.5, 0.0 };
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 3, verts, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(vertexLoc);
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(100, 200);
glutInitWindowSize(600, 400);
glutCreateWindow("Basic Setup");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ReshapeWindow);
GLenum err = glewInit();
if(err != GLEW_OK) {
cerr << "GLEW Error: " << glewGetErrorString(err) << endl;
return 1;
}
SetupRC(); //Setup rendering context
glutMainLoop();
return 0;
}
This is the whole file:
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glut.h>
GLuint vertexLoc; //location of vVertex attribute
GLuint vertexArray; //vertex buffer
GLuint vao; //vertex array object
GLuint prog; //Handle to shader prog
int SetupShaders(const GLchar*, const GLchar*);
void RenderScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLfloat vColor[] = { 0.8, 0.7, 0.1, 1.0 };
glUseProgram(prog);
glUniform4fv(glGetUniformLocation(prog, "vColor"), 1, vColor);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glutSwapBuffers();
}
void ReshapeWindow(int w, int h) {
glViewport(0, 0, w, h);
}
void LoadShaderSource(const char* loc, std::string& src) {
std::ifstream file(loc);
std::string line;
if(file.is_open()) {
while(file.good()) {
getline(file, line);
src.append(line);
src.append("
");
}
file.close();
}
}
void SetupRC() {
glClearColor(0.0, 0.0, 1.0, 1.0);
std::string srcVS, srcFS;
LoadShaderSource("VS.vert", srcVS);
LoadShaderSource("FS.frag", srcFS);
if(SetupShaders(srcVS.c_str(), srcFS.c_str())!=0)
exit(1);
GLfloat verts[] = { -0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
0.0, 0.5, 0.0 };
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 3, verts, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(vertexLoc);
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}
void printShaderInfoLog(GLuint obj) {
int infologLen = 0;
int charsWritten = 0;
GLchar *infoLog;
glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infologLen);
if(infologLen > 0) try {
infoLog = new GLchar[infologLen];
glGetShaderInfoLog(obj, infologLen, &charsWritten, infoLog);
cout << infoLog;
delete infoLog;
} catch (...) {
cerr << "
Error allocating memory
";
}
}
void printProgramInfoLog(GLuint obj) {
int infologLen = 0;
int charsWritten = 0;
GLchar *infoLog;
glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infologLen);
if(infologLen > 0) try {
infoLog = new GLchar[infologLen];
glGetProgramInfoLog(obj, infologLen, &charsWritten, infoLog);
cout << infoLog;
delete infoLog;
} catch (...) {
cerr << "
Error allocating memory
";
}
}
int SetupShaders(const GLchar* VS_src, const GLchar* FS_src) {
GLuint VS, FS; //handles to objects
GLint vertCompiled, fragCompiled; //status values
GLint linked;
VS = glCreateShader(GL_VERTEX_SHADER);
FS = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(VS, 1, &VS_src, NULL);
glShaderSource(FS, 1, &FS_src, NULL);
glCompileShader(VS);
glGetShaderiv(VS, GL_COMPILE_STATUS, &vertCompiled);
cout << "Vertex Shader Info Log:
";
printShaderInfoLog(VS);
glCompileShader(FS);
glGetShaderiv(FS, GL_COMPILE_STATUS, &fragCompiled);
printShaderInfoLog(FS);
cout << "Fragment Shader Info Log:
";
if((vertCompiled==GL_FALSE) || (fragCompiled==GL_FALSE)) {
glDeleteShader(VS);
glDeleteShader(FS);
return 1;
}
prog = glCreateProgram();
glAttachShader(prog, VS);
glAttachShader(prog, FS);
glBindAttribLocation(prog, 1, "vVertex");
vertexLoc = 1;
glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &linked);
printProgramInfoLog(prog);
glDeleteShader(VS); //These are no longer needed
glDeleteShader(FS);
if(linked==GL_FALSE) {
glDeleteProgram(prog);
return 2;
}
return 0;
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(100, 200);
glutInitWindowSize(600, 400);
glutCreateWindow(“Basic Setup”);
glutDisplayFunc(RenderScene);
glutReshapeFunc(ReshapeWindow);
GLenum err = glewInit();
if(err != GLEW_OK) {
cerr << "GLEW Error: " << glewGetErrorString(err) << endl;
return 1;
}
SetupRC(); //Setup rendering context
glutMainLoop();
//
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &vertexArray);
glDeleteVertexArrays(1, &vao);
return 0;
}
[/QUOTE]</div>
Vertex Shader:
<div class="ubbcode-block"><div class="ubbcode-header">Click to reveal.. <input type="button" class="form-button" value="Show me!" onclick="toggle_spoiler(this, 'Yikes, my eyes!', 'Show me!')" />]<div style="display: none;">
attribute vec4 vVertex;
void main() {
gl_Position = vVertex;
}
[/QUOTE]</div>
Fragment Shader:
<div class="ubbcode-block"><div class="ubbcode-header">Click to reveal.. <input type="button" class="form-button" value="Show me!" onclick="toggle_spoiler(this, 'Yikes, my eyes!', 'Show me!')" />]<div style="display: none;">
uniform vec4 vColor;
void main() {
gl_FragColor = vColor;
}
[/QUOTE]</div>