Moved shader creation code out of main

This commit is contained in:
Warwick 2025-10-01 14:29:51 +01:00
parent 05b0361c69
commit 7d15493417
3 changed files with 86 additions and 51 deletions

View file

@ -1,68 +1,29 @@
#include <GL/glew.h>
#include <SDL3/SDL.h>
#include <stdlib.h>
#include <time.h>
#include "SDL3/SDL_events.h"
#include "SDL3/SDL_keycode.h"
#include "camera.h"
#include "shader.h"
#include "window.h"
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main(int argc, char *argv[]) {
wn_window window = {0};
if (!wn_window_init(&window)) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize wn_window");
return EXIT_FAILURE;
}
wn_shader_code_location shader_code_location = {
.vertex_shader_source_path = "shaders/vert.glsl",
.fragment_shader_source_path = "shaders/frag.glsl"};
const char *vertexShaderSource = SDL_LoadFile("shaders/vert.glsl", NULL);
const char *fragmentShaderSource = SDL_LoadFile("shaders/frag.glsl", NULL);
// vertex shader
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// check for shader compile errors
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to compile vertex shader: %s", infoLog);
wn_shader shader = wn_shader_init(shader_code_location);
if (shader.success == false) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize shader");
return EXIT_FAILURE;
}
// fragment shader
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// check for shader compile errors
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to compile fragment shader: %s", infoLog);
}
// Free source code memory
SDL_free((void *)vertexShaderSource);
SDL_free((void *)fragmentShaderSource);
// link shaders
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to link shader program: %s", infoLog);
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// set up vertex data (and buffer(s)) and configure vertex attributes
float vertices[] = {
@ -134,7 +95,8 @@ int main(int argc, char *argv[]) {
mat4 mvp;
camera_calc_mvp(&mvp, &camera);
// glm_mat4_print(mvp,stdout);
int mvp_uniform_location = glGetUniformLocation(shaderProgram, "MVP");
int mvp_uniform_location =
glGetUniformLocation(shader.shaderProgram, "MVP");
glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]);
// render
@ -142,7 +104,7 @@ int main(int argc, char *argv[]) {
glClear(GL_COLOR_BUFFER_BIT);
// draw our first triangle
glUseProgram(shaderProgram);
glUseProgram(shader.shaderProgram);
glBindVertexArray(
VAO); // seeing as we only have a single VAO there's no need to bind it
// every time, but we'll do so to keep things a bit more organized
@ -156,8 +118,8 @@ int main(int argc, char *argv[]) {
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
glDeleteProgram(shaderProgram);
wn_shader_deinit(shader);
wn_window_deinit(&window);
return EXIT_SUCCESS;

View file

@ -0,0 +1,70 @@
#include "shader.h"
#include "SDL3/SDL_iostream.h"
#include "SDL3/SDL_log.h"
#include <GLES2/gl2.h>
wn_shader wn_shader_init(wn_shader_code_location shader_code_location) {
wn_shader shader = {.shaderProgram = 0, .success = false};
const char *vertexShaderSource =
SDL_LoadFile(shader_code_location.vertex_shader_source_path, NULL);
const char *fragmentShaderSource =
SDL_LoadFile(shader_code_location.fragment_shader_source_path, NULL);
// vertex shader
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// check for shader compile errors
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to compile vertex shader: %s", infoLog);
return shader;
}
// fragment shader
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// check for shader compile errors
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to compile fragment shader: %s", infoLog);
return shader;
}
// Free source code memory
SDL_free((void *)vertexShaderSource);
SDL_free((void *)fragmentShaderSource);
// link shaders
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to link shader program: %s", infoLog);
return shader;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
shader.shaderProgram = shaderProgram;
shader.success = true;
return shader;
}
void wn_shader_deinit(wn_shader shader) {
glDeleteProgram(shader.shaderProgram);
}

View file

@ -1,5 +1,7 @@
#pragma once
#include <stdbool.h>
typedef struct {
const char *vertex_shader_source_path;
const char *fragment_shader_source_path;
@ -7,6 +9,7 @@ typedef struct {
struct wn_shader_s {
unsigned int shaderProgram;
bool success;
};
typedef struct wn_shader_s wn_shader;