strichmaennchen git · main
git clone https://git.christianimmanuel.de/games/strichmaennchen.gitwget https://git.christianimmanuel.de/games/strichmaennchen/archive/strichmaennchen.tar.gzshader.c raw
#include "glfuncs.h"
#include <stdio.h>
#include <stdlib.h>
char* readFile(const char* path) {
FILE* f = fopen(path, "rb");
if (!f) return NULL;
fseek(f, 0, SEEK_END);
long size = ftell(f);
rewind(f);
char* buffer = malloc(size + 1); // +1 for '\0'
if (!buffer) { fclose(f); return NULL; }
size_t read = fread(buffer, 1, size, f);
fclose(f);
if (read != (size_t)size) {
fprintf(stderr, "Failed to read entire file\n");
free(buffer);
return NULL;
}
buffer[size] = '\0'; // null-terminate
return buffer;
}
GLuint loadShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
char log[512];
glGetShaderInfoLog(shader, 512, NULL, log);
fprintf(stderr, "Shader compile error: %s\n", log);
}
return shader;
}
GLuint createShaderProgram(const char* vertSrc, const char* fragSrc) {
GLuint vertex = loadShader(GL_VERTEX_SHADER, vertSrc);
GLuint fragment = loadShader(GL_FRAGMENT_SHADER, fragSrc);
GLuint program = glCreateProgram();
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
GLint success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
char log[512];
glGetProgramInfoLog(program, 512, NULL, log);
fprintf(stderr, "Shader link error: %s\n", log);
}
glDeleteShader(vertex);
glDeleteShader(fragment);
return program;
}