shader update strings

This commit is contained in:
Daniel Ledda
2025-01-08 11:02:30 +01:00
parent b84b59df09
commit 994cbc688f
3 changed files with 37 additions and 35 deletions

View File

@@ -1,6 +1,3 @@
#include <fstream>
#include <sstream>
#include <iostream>
#include "Shader.h" #include "Shader.h"
#include "../lib/djstdlib/core.h" #include "../lib/djstdlib/core.h"
#include "../lib/glad/glad.h" #include "../lib/glad/glad.h"
@@ -10,35 +7,34 @@ enum ShaderType {
vertex=GL_VERTEX_SHADER, vertex=GL_VERTEX_SHADER,
}; };
uint32 createGlShader(const char* file_path, ShaderType shader_type, char* info_log) { uint32 createGlShader(string file_path, ShaderType shader_type) {
std::stringstream shader_stream; Scratch temp = scratchStart(0, 0);
std::ifstream shader_file; string shader_code = readEntireFile(temp.arena, file_path);
shader_file.open(file_path); GLuint shader = glCreateShader(shader_type);
shader_stream << shader_file.rdbuf(); const char *shader_code_cstr = cstring(temp.arena, shader_code);
shader_file.close(); glShaderSource(shader, 1, &shader_code_cstr, NULL);
std::string string = shader_stream.str(); glCompileShader(shader);
const char *shader_code = string.c_str();
GLuint vertex_shader = glCreateShader(shader_type);
glShaderSource(vertex_shader, 1, &shader_code, NULL);
glCompileShader(vertex_shader);
int success; int success;
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) { if (!success) {
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); GLint info_log_length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);
string info_log = PushString(temp.arena, (size_t)info_log_length + 1);
glGetShaderInfoLog(shader, info_log_length, NULL, info_log.str);
const char* shader_type_name = shader_type == ShaderType::fragment ? "FRAGMENT" : "VERTEX"; const char* shader_type_name = shader_type == ShaderType::fragment ? "FRAGMENT" : "VERTEX";
std::cout << "ERROR::SHADER::" << shader_type_name << "::COMPILATION_FAILED\n" << info_log << std::endl; log("%s shader compilation error (%S):\n%S", shader_type_name, file_path, info_log);
} }
scratchEnd(temp);
return vertex_shader; return shader;
} }
Shader createShader(const char* vertex_path, const char* fragment_path) { Shader createShader(string vertex_path, string fragment_path) {
Scratch temp = scratchStart(0, 0);
Shader result = {0}; Shader result = {0};
char info_log[512] = {0}; uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex);
uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex, info_log); uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment);
uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment, info_log);
result.prog_id = glCreateProgram(); result.prog_id = glCreateProgram();
glAttachShader(result.prog_id, vertex_shader); glAttachShader(result.prog_id, vertex_shader);
@@ -48,13 +44,17 @@ Shader createShader(const char* vertex_path, const char* fragment_path) {
int success; int success;
glGetProgramiv(result.prog_id, GL_LINK_STATUS, &success); glGetProgramiv(result.prog_id, GL_LINK_STATUS, &success);
if (!success) { if (!success) {
glGetProgramInfoLog(result.prog_id, 512, NULL, info_log); GLint info_log_length;
std::cout << "ERROR::SHADER::PROGRAM::LINK_FAILED\n" << info_log << std::endl; glGetShaderiv(result.prog_id, GL_INFO_LOG_LENGTH, &info_log_length);
string info_log_prog = PushString(temp.arena, (size_t)info_log_length + 1);
glGetProgramInfoLog(result.prog_id, info_log_length, NULL, info_log_prog.str);
log("Shader program link error:\n%S", info_log_prog);
} }
glDeleteShader(vertex_shader); glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader); glDeleteShader(fragment_shader);
scratchEnd(temp);
return result; return result;
} }

View File

@@ -1,10 +1,12 @@
#ifndef LEDDA_SHADER_H #ifndef LEDDA_SHADER_H
#define LEDDA_SHADER_H #define LEDDA_SHADER_H
#include "../lib/djstdlib/core.h"
struct Shader { struct Shader {
unsigned int prog_id; uint32 prog_id;
}; };
Shader createShader(const char* vertex_path, const char* fragment_path); Shader createShader(string vertex_path, string fragment_path);
#endif #endif

View File

@@ -300,20 +300,20 @@ int main_cmd() {
} }
int main_gfx() { int main_gfx() {
Arena *arena = arenaAlloc(Megabytes(128));
WindowDims window_dims = { 800, 600 }; WindowDims window_dims = { 800, 600 };
GLFWwindow *window = init_window_and_gl(&window_dims); GLFWwindow *window = init_window_and_gl(&window_dims);
if (!window) { if (!window) {
return -1; return -1;
} }
Arena *arena = arenaAlloc(Megabytes(128)); app_state.current_polycube = 0;
app_state.last_polycube_visible = 6;
app_state.active_shader = 0;
app_state.polycubes = {};
app_state.current_polycube=0; Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl"_s, "../assets/shaders/phong-solid.fragment.glsl"_s);
app_state.last_polycube_visible=6;
app_state.active_shader=0;
app_state.polycubes={};
Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl", "../assets/shaders/phong-solid.fragment.glsl");
app_state.active_shader = &phong_shader; app_state.active_shader = &phong_shader;
cube_mesh = createMesh("../assets/models/c000000.obj"); cube_mesh = createMesh("../assets/models/c000000.obj");