I am using OpenGL 4.1, GLFW 3 and GLEW. I am trying to draw a simple triangle with the color purple.
The triangle is drawn, the color is not.
This code is from a tutorial, I had to update the GLFW calls to reflect GLFW 3.x. As far as I can tell, the color shader appears to be correct.
EDIT: Solved a problem where the GLFW window is unresponsive to key presses and mouse clicks. Need to include call to glfwPollEvents() within the drawing loop. Still no color.
#include <GL/glew.h> // include GLEW and new version of GL on Windows
#include <GL/glfw3.h> // GLFW helper library
#include <stdio.h>
#include <string>
#include <iostream>
int main () {
GLFWwindow* window;
// start GL context and O/S window using the GLFW helper library
if(!glfwInit ()){
std::cout << "Failed at glfwInit()!" << std::endl;
glfwTerminate();
return -1;
}
// "hint" that the version 4.2 should be run with no back-compat stuff
int major = 4;
int minor = 1;
glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, major);
glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, minor);
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// open a window of sixe 640x480
window = glfwCreateWindow(640, 480, "Window!!!", NULL, NULL);
if(!window){
std::cout << "Failed at window creation!" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// start GLEW extension handler
GLenum err = glewInit ();
if(GLEW_OK != err){
std::cout << "glewInit failed!!!" << std::endl;
glfwTerminate();
return -1;
}
// get version info
const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
const GLubyte* version = glGetString (GL_VERSION); // version as a string
printf("Renderer: %s
", renderer);
printf("OpenGL version supported %s
", version);
// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable (GL_DEPTH_TEST); // enable depth-testing
glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"
int i;
//A triangle's vertices
float points[] = {
0.0f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
};
//Create and setup vertex buffer object
unsigned int vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &points[0], GL_STATIC_DRAW);
//Create and setup vertex array (or attribute?) object to store vbo point data
unsigned int vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
std::string vertex_shader =
"in vec3 vp;"
"void main () {"
" gl_Position = vec4(vp, 1.0);"
"}";
std::string fragment_shader =
"out vec4 frag_color;"
"void main() {"
" frag_color = vec4 (0.5, 0.0, 0.5, 1.0f);"
"}";
unsigned int vs = glCreateShader(GL_VERTEX_SHADER);
const char* str = vertex_shader.c_str();
glShaderSource(vs, 1, &str, NULL);
glCompileShader(vs);
unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER);
const char* strb = fragment_shader.c_str();
glShaderSource (fs, 1, &strb, NULL);
glCompileShader(fs);
unsigned int shader_program = glCreateProgram();
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);
bool running = true;
while (running){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_program);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
running = !glfwGetKey(window, GLFW_KEY_ESCAPE) && !glfwWindowShouldClose(window);
glfwPollEvents(); //Needs to be called or else window is completely unresponsive to move, resize, close, key strokes, etc
}
// close GL context and any other GLFW resources
glfwTerminate();
return 0;
}