read shader sources from filesystem

This commit is contained in:
Zack Buhman 2025-09-28 13:31:56 -05:00
parent 5eadf6016a
commit 6c57490bdb
3 changed files with 91 additions and 92 deletions

14
src/fragment.glsl Normal file
View File

@ -0,0 +1,14 @@
#version 120
uniform sampler2D textures[2];
varying float fade_factor;
varying vec2 texcoord;
void main()
{
gl_FragColor = mix(texture2D(textures[0], texcoord),
texture2D(textures[1], texcoord),
fade_factor
);
}

View File

@ -10,54 +10,49 @@
#include <glad/glad.h>
#include <GLFW/glfw3.h>
static void * read_file(const char * filename)
{
int fd = open(filename, O_RDONLY);
if (fd == -1) {
fprintf(stderr, "open(%s): %s\n", filename, strerror(errno));
return NULL;
}
off_t size = lseek(fd, 0, SEEK_END);
if (size == (off_t)-1) {
fprintf(stderr, "lseek(%s, SEEK_END): %s\n", filename, strerror(errno));
return NULL;
}
off_t start = lseek(fd, 0, SEEK_SET);
if (start == (off_t)-1) {
fprintf(stderr, "lseek(%s, SEEK_SET): %s\n", filename, strerror(errno));
return NULL;
}
void * buf = malloc(size+1);
ssize_t read_size = read(fd, buf, size);
if (read_size == -1) {
fprintf(stderr, "read(%s): %s\n", filename, strerror(errno));
return NULL;
}
((char*)buf)[read_size] = 0;
return buf;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
const char *vertexShaderSource = R"(
#version 120
attribute vec2 position;
varying vec2 texcoord;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
vec2 tex = position * vec2(0.5) + vec2(0.5);
texcoord = vec2(tex.x * 400 / 512,
(1.0 - tex.y) * 300 / 512);
}
)"
;
const char *fragmentShaderSource = R"(
#version 120
uniform float fade_factor;
uniform sampler2D textures[2];
varying vec2 texcoord;
void main()
{
gl_FragColor = mix(texture2D(textures[0], texcoord),
texture2D(textures[1], texcoord),
fade_factor
);
}
)"
;
unsigned int compile_shaders()
{
void * vertexShaderSource = read_file("src/vertex.glsl");
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glShaderSource(vertexShader, 1, (const char **)&vertexShaderSource, NULL);
glCompileShader(vertexShader);
{
int success;
@ -68,10 +63,12 @@ unsigned int compile_shaders()
printf("vertex shader compile failed:\n%s\n", infoLog);
}
}
free(vertexShaderSource);
void * fragmentShaderSource = read_file("src/fragment.glsl");
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
{
int success;
@ -82,6 +79,7 @@ unsigned int compile_shaders()
printf("fragment shader compile failed:\n%s\n", infoLog);
}
}
free(fragmentShaderSource);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
@ -118,47 +116,16 @@ static int make_buffer(unsigned int target,
}
static const float vertex_buffer_data[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f
-1.0f, -1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
};
static const unsigned short element_buffer_data[] = {
0, 1, 2, 3
};
static void * read_file(const char * filename)
{
int fd = open(filename, O_RDONLY);
if (fd == -1) {
fprintf(stderr, "open(%s): %s\n", filename, strerror(errno));
return NULL;
}
off_t size = lseek(fd, 0, SEEK_END);
if (size == (off_t)-1) {
fprintf(stderr, "lseek(%s, SEEK_END): %s\n", filename, strerror(errno));
return NULL;
}
off_t start = lseek(fd, 0, SEEK_SET);
if (start == (off_t)-1) {
fprintf(stderr, "lseek(%s, SEEK_SET): %s\n", filename, strerror(errno));
return NULL;
}
void * buf = malloc(size);
ssize_t read_size = read(fd, buf, size);
if (read_size == -1) {
fprintf(stderr, "read(%s): %s\n", filename, strerror(errno));
return NULL;
}
return buf;
}
static unsigned int make_texture(const char * filename)
{
unsigned int texture;
@ -188,7 +155,7 @@ static unsigned int make_texture(const char * filename)
struct location {
struct {
unsigned int fade_factor;
unsigned int time;
unsigned int textures[2];
} uniform;
struct {
@ -236,12 +203,12 @@ int main()
struct location location;
location.uniform.fade_factor = glGetUniformLocation(shaderProgram, "fade_factor");
location.uniform.time = glGetUniformLocation(shaderProgram, "time");
location.uniform.textures[0] = glGetUniformLocation(shaderProgram, "textures[0]");
location.uniform.textures[1] = glGetUniformLocation(shaderProgram, "textures[1]");
printf("uniforms:\n fade_factor: %u\n textures_0: %u\n textures_1: %u\n",
location.uniform.fade_factor,
printf("uniforms:\n time: %u\n textures_0: %u\n textures_1: %u\n",
location.uniform.time,
location.uniform.textures[0],
location.uniform.textures[1]);
@ -249,7 +216,7 @@ int main()
printf("attributes:\n position %u\n",
location.attrib.position);
float fade_factor = 0;
float time = 0;
struct timespec last;
struct timespec cur;
@ -257,17 +224,23 @@ int main()
clock_gettime(CLOCK_MONOTONIC, &last);
while(!glfwWindowShouldClose(window)) {
clock_gettime(CLOCK_MONOTONIC, &cur);
uint64_t last_msec = (last.tv_sec * 1000) + (last.tv_nsec * 1e-06);
uint64_t cur_msec = (cur.tv_sec * 1000) + (cur.tv_nsec * 1e-06);
uint64_t dt = cur_msec - last_msec;
time = (float)((double)dt * 0.001);
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearColor(0.1f, 0.1f, 0.1f, 0.1f);
glClear(GL_COLOR_BUFFER_BIT);
//
// render
//
glUseProgram(shaderProgram);
glUniform1f(location.uniform.fade_factor, fade_factor);
glUniform1f(location.uniform.time, time);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_0);
@ -279,10 +252,10 @@ int main()
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer(location.attrib.position,
2,
4,
GL_FLOAT,
GL_FALSE,
(sizeof (float)) * 2,
(sizeof (float)) * 4,
(void*)0
);
glEnableVertexAttribArray(location.attrib.position);
@ -298,14 +271,6 @@ int main()
glfwSwapBuffers(window);
glfwPollEvents();
clock_gettime(CLOCK_MONOTONIC, &cur);
uint64_t last_msec = (last.tv_sec * 1000) + (last.tv_nsec * 1e-06);
uint64_t cur_msec = (cur.tv_sec * 1000) + (cur.tv_nsec * 1e-06);
uint64_t dt = cur_msec - last_msec;
fade_factor = sin(dt * 0.001f) * 0.5 + 0.5;
//last = cur;
}
glfwTerminate();

20
src/vertex.glsl Normal file
View File

@ -0,0 +1,20 @@
#version 120
uniform float time;
attribute vec4 position;
varying float fade_factor;
varying vec2 texcoord;
void main()
{
gl_Position = position;
vec2 tex = position.xy * vec2(0.5) + vec2(0.5);
texcoord = vec2(tex.x * 400 / 512,
(1.0 - tex.y) * 300 / 512);
fade_factor = sin(time) * 0.5 + 0.5;
}