I'm currently learning modern OpenGL. So far I have been programming everything within the same scope of the primary cpp file, but the more I learn, the more that file becomes very lengthy and cluttered. So naturally, I have been trying to break up my code by putting some within a user defined function and even a user defined class, but I keep having the same problem in that I just have a black screen instead of a rendered triangle.
I am currently using Glfw3 and Glew with my code if that helps. I have also tried passing certain values, like window handles, but to no avail. If I put all the code within my user defined function in main(), the triangle becomes rendered.
Here is my code:
framework.h
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#pragma comment(lib, "glfw3dll.lib")
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "opengl32.lib")
using namespace std;
framework.cpp
#include "framework.h"
#include "rendering.h"
int windowWidth = 800;
int windowHeight = 450;
ofstream outFile("output.txt");
renderingUtils renderingClass; //Rendering Utils Class
void renderFunction(float*, GLFWwindow*);
float triangleW = 0.125;
float triangleH = 0.125;
float coordinateX = 0.25;
float coordinateY = 0.25;
float points[24] = {
0.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.0f, 0.0f, 1.0f,
0.0f, 0.5f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
/*float points[24] = { //Vertex Information
coordinateX, coordinateY, 0.0f, 1.0f,
coordinateX + triangleW, coordinateY, 0.0f, 1.0f,
coordinateX + (triangleW / 2), coordinateY + triangleH, 0.0f, 1.0f, //First Triangle
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f, //Color Information
};*/
int main(){
//Start GL context O/S window using the GLFW helper library
if (!glfwInit()){
outFile << "ERROR: Could not start GLFW3\n";
return 1;
}
GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, "Tutorial Project", NULL, NULL);
if (!window){
outFile << "ERROR: Could not open window with GLFW3\n";
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
//start GLEW extension handler
glewExperimental = GL_TRUE;
glewInit();
//Get version info
const GLubyte* renderer = glGetString(GL_RENDERER); //Get renderer string
const GLubyte* version = glGetString(GL_VERSION); //Version as a string
std::cout << "Renderer: " << renderer << "\n";
std::cout << "OpenGL version supported: " << version << "\n";
//Initialize Display
renderFunction(points, window);
while (!glfwWindowShouldClose(window)){
//Compute Position Offsets
//Adjust Vertex Data
//Render Display
//renderingClass.updateScene();
//Update other events like input handling
glfwPollEvents();
}
//Close GL context and any other GLFW resources
glfwTerminate();
getchar();
return 0;
}
void renderFunction(float* points, GLFWwindow* window){
glfwMakeContextCurrent(window);
// Test Code below
unsigned int vbo = 0;
unsigned int vao = 0;
unsigned int vs;
unsigned int fs;
unsigned int program;
const char* vertex_shader =
"#version 330\n"
"layout(location = 0) in vec4 position;"
"layout(location = 1) in vec4 color;"
"smooth out vec4 theColor;"
"void main () {"
" gl_Position = position;"
" theColor = color;"
"}";
const char* fragment_shader =
"#version 330\n"
"smooth in vec4 theColor;"
"out vec4 outputColor;"
"void main () {"
" outputColor = theColor;"
"}";
std::cout << "Scene set up.\n";
std::cout << points[4] << "\n";
//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 interprests a smaller value as "closer"
glViewport(0, 0, (GLsizei)800, (GLsizei)450);
glGenBuffers(1, &vbo); //
glBindBuffer(GL_ARRAY_BUFFER, vbo); //
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); //
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenVertexArrays(1, &vao); //
glBindVertexArray(vao); //
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0); //
glEnableVertexAttribArray(1); //
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); //
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48); //
vs = glCreateShader(GL_VERTEX_SHADER);//
glShaderSource(vs, 1, &vertex_shader, NULL); //
glCompileShader(vs); //
GLint status;
glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) { std::cout << "Compile status1: fail\n"; }
fs = glCreateShader(GL_FRAGMENT_SHADER); //
glShaderSource(fs, 1, &fragment_shader, NULL); //
glCompileShader(fs); //
GLint status2;
glGetShaderiv(fs, GL_COMPILE_STATUS, &status2);
if (status2 == GL_FALSE){ std::cout << "Compile status2: fail\n"; }
program = glCreateProgram(); //
glAttachShader(program, fs); //
glAttachShader(program, vs); //
glLinkProgram(program); //
GLint status3;
glGetProgramiv(program, GL_LINK_STATUS, &status3);
if (status3 == GL_FALSE) { std::cout << "GL program failure \n"; }
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //
glUseProgram(program); //
glBindVertexArray(vao); //
glDrawArrays(GL_TRIANGLES, 0, 3); //
glfwSwapBuffers(window);
}
Any ideas as why this is not working?