I know the shaders have linked together since i was following learnopengl.com and that example worked. Then when i tried to rewrite it and abstract a bit, it just stopped rendering to the screen. I also am not getting any errors in the console. This is my first time using opengl so i know its just a little syntax issue. But i have not been able to find it for ages. Any help will be appreciated, thanks.
const char* vertexShaderSource = "#version 330 coren"
"layout (location = 0) in vec3 aPos;n"
"void main()n"
"{n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);n"
"}";
const char* fragmentShaderSource = "#version 330 coren"
"out vec4 FragColor;n"
"void main()n"
"{n"
"FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);n"
"}";
unsigned int compile_shader(const char *source, GLenum type) {
unsigned int shader = glCreateShader(type);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
return shader;
}
unsigned int create_program() {
unsigned int vertex_shader = compile_shader(vertexShaderSource, GL_VERTEX_SHADER);
unsigned int fragment_shader = compile_shader(fragmentShaderSource, GL_FRAGMENT_SHADER);
unsigned int program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return program;
}
void setup_buffers(unsigned int *vao, unsigned int *vbo) {
glGenVertexArrays(1, vao);
glBindVertexArray(*vao);
glGenBuffers(1, vbo);
glBindBuffer(GL_ARRAY_BUFFER, *vbo);
// unbind vao and vbo
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void add_triangle(unsigned int vao, unsigned int vbo, float *vertices, GLenum usage) {
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, usage);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
}
void render_triangles(unsigned int program, unsigned int vao, unsigned int vbo) {
glUseProgram(program);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
}
int main() {
int width = 640;
int height = 480;
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFWn");
return -1;
}
GLFWwindow* window = glfwCreateWindow(width, height, "Test", NULL, NULL);
if (!window) {
fprintf(stderr, "Failed to create GLFW windown");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
fprintf(stderr, "failed to initialise GLADn");
return -1;
}
// handles when the window resizes
glViewport(0, 0, width, height);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
unsigned int shader_program = create_program();
unsigned int vao, vbo;
setup_buffers(&vao, &vbo);
// Triangle 1 vertices
float triangle1[] = {
0.0f, 0.5f, 0.0f, // Top vertex
-0.5f, -0.5f, 0.0f, // Bottom left vertex
0.5f, -0.5f, 0.0f // Bottom right vertex
};
add_triangle(vao, vbo, triangle1, GL_STATIC_DRAW);
printf("%lun", vbo);
printf("%lun", vao);
// Main program loop
while (!glfwWindowShouldClose(window)) {
process_input(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
render_triangles(shader_program, vao, vbo);
glfwPollEvents();
glfwSwapBuffers(window);
GLenum error = glGetError();
if (error != GL_NO_ERROR) {
printf("OpenGL error: %dn", error);
}
}
// Clean up and terminate GLFW
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}