read shader sources from filesystem
This commit is contained in:
parent
5eadf6016a
commit
6c57490bdb
14
src/fragment.glsl
Normal file
14
src/fragment.glsl
Normal 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
|
||||
);
|
||||
}
|
149
src/main.c
149
src/main.c
@ -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
20
src/vertex.glsl
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user