boilerplate in shader reduction

This commit is contained in:
Rakarake 2026-02-22 20:30:33 +01:00
parent f6706982ce
commit 2383faf456
2 changed files with 42 additions and 22 deletions

View file

@ -1,9 +1,3 @@
#version 330 core
uniform vec2 WindowSize;
uniform float time;
layout(location = 0) out vec4 color;
float lerp(float a, float b, float x) {
return a + x*(b-a);
}
@ -73,19 +67,20 @@ float limit(float val, float min, float max) {
return out_val;
}
void main() {
vec2 screen_uv = gl_FragCoord.xy / WindowSize;
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 screen_uv = gl_FragCoord.xy / iResolution;
// We'll make origin in the top-left.
screen_uv.y = 1.0 - screen_uv.y;
screen_uv.x *= WindowSize.x / WindowSize.y;
screen_uv.x *= iResolution.x / iResolution.y;
vec2 uv = vec2(screen_uv.x, screen_uv.y);
uv.y += sin(uv.x * 2.0 + time * 0.2) * 0.47;
uv.y += sin(uv.x * 4.3 + time * 1.34) * 0.09;
uv.y += sin(uv.x * 2.0 + iTime * 0.2) * 0.47;
uv.y += sin(uv.x * 4.3 + iTime * 1.34) * 0.09;
uv += 100.0;
float out_val = perlin_noise(uv, vec2(0.0, 0.0), time / 1.0);
float min = 0.42 + sin(time)/8.0;
float max = 0.58 + sin(time)/8.0;
float out_val = perlin_noise(uv, vec2(0.0, 0.0), iTime / 1.0);
float min = 0.42 + sin(iTime)/8.0;
float max = 0.58 + sin(iTime)/8.0;
out_val = limit(out_val, min, max);
color = vec4(out_val, 0.4, 0.8, 1.0);
fragColor = vec4(out_val, 0.4, 0.8, 1.0);
}

View file

@ -28,7 +28,7 @@ GLuint compile_shader(GLuint type, const char *src) {
}
const char *vertex_shader_src =
"#version 330 core\n"
"#version 300 es\n"
"\n"
"layout(location = 0) in vec2 aPos;\n"
"\n"
@ -36,6 +36,21 @@ const char *vertex_shader_src =
" gl_Position = vec4(aPos, 0.0, 1.0);\n"
"}\n";
const char *fragment_header_src =
"#version 300 es\n"
"precision highp float;\n"
"precision highp int;\n"
"precision lowp sampler2D;\n"
"precision lowp samplerCube;\n"
"layout(location = 0) out vec4 color;\n"
"uniform vec2 iResolution;\n"
"uniform float iTime;\n"
"void mainImage(out vec4 fragColor, in vec2 fragCoord);\n"
"void main() {\n"
" mainImage(color, gl_FragCoord.xy);\n"
"}\n"
"\n";
/// returns 0 if failed.
GLuint create_shader(const char *fragment_src) {
GLuint program = glCreateProgram();
@ -60,14 +75,24 @@ GLuint load_shader(const char *path) {
printf("failed to open shader file: '%s'\n", path);
exit(1);
}
fseek(handle, 0L, SEEK_END);
long length = ftell(handle);
long file_length = ftell(handle);
fseek(handle, 0L, SEEK_SET);
long header_length = strlen(fragment_header_src);
long length = header_length + file_length;
char *string = malloc((length + 1) * sizeof(char));
if (!fread(string, sizeof(char), length, handle)) {
// Copy header.
strcpy(string, fragment_header_src);
if (!fread(string + header_length, sizeof(char), file_length, handle)) {
printf("failed to read shader file\n");
exit(1);
}
// I love C
string[length] = '\0';
fclose(handle);
@ -164,11 +189,11 @@ void render(Renderer *state, int w, int h, double time, char *shader_path, int r
// Shader parameters.
glUseProgram(state->shader);
int uniform_WindowSize = glGetUniformLocation(state->shader, "WindowSize");
glUniform2f(uniform_WindowSize, w, h);
int uniform_iResolution = glGetUniformLocation(state->shader, "iResolution");
glUniform2f(uniform_iResolution, w, h);
int uniform_time = glGetUniformLocation(state->shader, "time");
glUniform1f(uniform_time, (float)time);
int uniform_iTime = glGetUniformLocation(state->shader, "iTime");
glUniform1f(uniform_iTime, (float)time);
glBindVertexArray(state->vao);
glDrawArrays(GL_TRIANGLES, 0, 6);