Moved shader creation code out of main
This commit is contained in:
parent
05b0361c69
commit
7d15493417
3 changed files with 86 additions and 51 deletions
64
src/main.c
64
src/main.c
|
|
@ -1,68 +1,29 @@
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "SDL3/SDL_events.h"
|
#include "SDL3/SDL_events.h"
|
||||||
#include "SDL3/SDL_keycode.h"
|
#include "SDL3/SDL_keycode.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include "shader.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
// settings
|
|
||||||
const unsigned int SCR_WIDTH = 800;
|
|
||||||
const unsigned int SCR_HEIGHT = 600;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
wn_window window = {0};
|
wn_window window = {0};
|
||||||
if (!wn_window_init(&window)) {
|
if (!wn_window_init(&window)) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize wn_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);
|
wn_shader shader = wn_shader_init(shader_code_location);
|
||||||
const char *fragmentShaderSource = SDL_LoadFile("shaders/frag.glsl", NULL);
|
if (shader.success == false) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize shader");
|
||||||
// vertex shader
|
return EXIT_FAILURE;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
// 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
|
// set up vertex data (and buffer(s)) and configure vertex attributes
|
||||||
float vertices[] = {
|
float vertices[] = {
|
||||||
|
|
@ -134,7 +95,8 @@ int main(int argc, char *argv[]) {
|
||||||
mat4 mvp;
|
mat4 mvp;
|
||||||
camera_calc_mvp(&mvp, &camera);
|
camera_calc_mvp(&mvp, &camera);
|
||||||
// glm_mat4_print(mvp,stdout);
|
// 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]);
|
glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]);
|
||||||
|
|
||||||
// render
|
// render
|
||||||
|
|
@ -142,7 +104,7 @@ int main(int argc, char *argv[]) {
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
// draw our first triangle
|
// draw our first triangle
|
||||||
glUseProgram(shaderProgram);
|
glUseProgram(shader.shaderProgram);
|
||||||
glBindVertexArray(
|
glBindVertexArray(
|
||||||
VAO); // seeing as we only have a single VAO there's no need to bind it
|
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
|
// 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);
|
glDeleteVertexArrays(1, &VAO);
|
||||||
glDeleteBuffers(1, &VBO);
|
glDeleteBuffers(1, &VBO);
|
||||||
glDeleteBuffers(1, &EBO);
|
glDeleteBuffers(1, &EBO);
|
||||||
glDeleteProgram(shaderProgram);
|
|
||||||
|
|
||||||
|
wn_shader_deinit(shader);
|
||||||
wn_window_deinit(&window);
|
wn_window_deinit(&window);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
|
||||||
70
src/shader.c
70
src/shader.c
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *vertex_shader_source_path;
|
const char *vertex_shader_source_path;
|
||||||
const char *fragment_shader_source_path;
|
const char *fragment_shader_source_path;
|
||||||
|
|
@ -7,6 +9,7 @@ typedef struct {
|
||||||
|
|
||||||
struct wn_shader_s {
|
struct wn_shader_s {
|
||||||
unsigned int shaderProgram;
|
unsigned int shaderProgram;
|
||||||
|
bool success;
|
||||||
};
|
};
|
||||||
typedef struct wn_shader_s wn_shader;
|
typedef struct wn_shader_s wn_shader;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue