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 "../lib/djstdlib/core.h"
#include "../lib/glad/glad.h"
@@ -10,35 +7,34 @@ enum ShaderType {
vertex=GL_VERTEX_SHADER,
};
uint32 createGlShader(const char* file_path, ShaderType shader_type, char* info_log) {
std::stringstream shader_stream;
std::ifstream shader_file;
shader_file.open(file_path);
shader_stream << shader_file.rdbuf();
shader_file.close();
std::string string = shader_stream.str();
const char *shader_code = string.c_str();
GLuint vertex_shader = glCreateShader(shader_type);
glShaderSource(vertex_shader, 1, &shader_code, NULL);
glCompileShader(vertex_shader);
uint32 createGlShader(string file_path, ShaderType shader_type) {
Scratch temp = scratchStart(0, 0);
string shader_code = readEntireFile(temp.arena, file_path);
GLuint shader = glCreateShader(shader_type);
const char *shader_code_cstr = cstring(temp.arena, shader_code);
glShaderSource(shader, 1, &shader_code_cstr, NULL);
glCompileShader(shader);
int success;
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
glGetShaderiv(shader, GL_COMPILE_STATUS, &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";
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 shader;
}
return vertex_shader;
}
Shader createShader(string vertex_path, string fragment_path) {
Scratch temp = scratchStart(0, 0);
Shader createShader(const char* vertex_path, const char* fragment_path) {
Shader result = {0};
char info_log[512] = {0};
uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex, info_log);
uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment, info_log);
uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex);
uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment);
result.prog_id = glCreateProgram();
glAttachShader(result.prog_id, vertex_shader);
@@ -48,13 +44,17 @@ Shader createShader(const char* vertex_path, const char* fragment_path) {
int success;
glGetProgramiv(result.prog_id, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(result.prog_id, 512, NULL, info_log);
std::cout << "ERROR::SHADER::PROGRAM::LINK_FAILED\n" << info_log << std::endl;
GLint info_log_length;
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(fragment_shader);
scratchEnd(temp);
return result;
}

View File

@@ -1,10 +1,12 @@
#ifndef LEDDA_SHADER_H
#define LEDDA_SHADER_H
#include "../lib/djstdlib/core.h"
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

View File

@@ -300,20 +300,20 @@ int main_cmd() {
}
int main_gfx() {
Arena *arena = arenaAlloc(Megabytes(128));
WindowDims window_dims = { 800, 600 };
GLFWwindow *window = init_window_and_gl(&window_dims);
if (!window) {
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 = {};
Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl", "../assets/shaders/phong-solid.fragment.glsl");
Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl"_s, "../assets/shaders/phong-solid.fragment.glsl"_s);
app_state.active_shader = &phong_shader;
cube_mesh = createMesh("../assets/models/c000000.obj");