add option to stop time
This commit is contained in:
parent
a79dfe064c
commit
2fd7797e7d
7
launch
7
launch
|
@ -1,12 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
executable="$1"
|
||||
options="$2"
|
||||
prime="prime-run"
|
||||
|
||||
if command -v $prime &> /dev/null
|
||||
then
|
||||
echo "launching $executable with nvidia prime offloading"
|
||||
$prime $executable
|
||||
echo "launching $executable $options with nvidia prime offloading"
|
||||
$prime $executable $options
|
||||
else
|
||||
$executable
|
||||
$executable $options
|
||||
fi
|
||||
|
|
6
makefile
6
makefile
|
@ -46,7 +46,11 @@ clean:
|
|||
-rm -r $(BIN_DIR)
|
||||
-rm */*.o
|
||||
|
||||
# TODO: extract run-* out to like, python scripts? arguments can be implemented with argparse to
|
||||
# manage simple interface with C binary
|
||||
run: $(TARGET)
|
||||
$(LAUNCH) $(TARGET)
|
||||
$(LAUNCH) $(TARGET) 1.0
|
||||
run-converge: $(TARGET)
|
||||
$(LAUNCH) $(TARGET) 0.0
|
||||
|
||||
.PHONY: run clean
|
||||
|
|
|
@ -2,10 +2,8 @@
|
|||
|
||||
const float FOVY = 90.0;
|
||||
|
||||
void updateCameraUniforms(GLuint shaderProgram, float aspect)
|
||||
void updateCameraUniforms(GLuint shaderProgram, float aspect, float t)
|
||||
{
|
||||
float t = now();
|
||||
|
||||
// wobble up dir
|
||||
vec3 cdir, cright, cup;
|
||||
vec3 up = {0.1*sin(t),1.0,0.05*cos(0.5*t)};
|
||||
|
|
|
@ -6,4 +6,4 @@
|
|||
|
||||
#include "clock.h"
|
||||
|
||||
void updateCameraUniforms(GLuint shaderProgram, float aspect);
|
||||
void updateCameraUniforms(GLuint shaderProgram, float aspect, float t);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "clock.h"
|
||||
|
||||
float now()
|
||||
float now(struct Epoch t)
|
||||
{
|
||||
return (float)SDL_GetTicks() / 1000.0;
|
||||
return t.speed * (float)SDL_GetTicks() / 1000.0;
|
||||
}
|
||||
|
|
|
@ -2,5 +2,10 @@
|
|||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
struct Epoch
|
||||
{
|
||||
float speed;
|
||||
};
|
||||
|
||||
// seconds since program start
|
||||
float now();
|
||||
float now(struct Epoch e);
|
||||
|
|
10
src/gfx.c
10
src/gfx.c
|
@ -174,16 +174,6 @@ void setVertexAttributes()
|
|||
// color
|
||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, (void*)(3*sizeof(float)));
|
||||
glEnableVertexAttribArray(1);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// uv
|
||||
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, stride, (void*)(6*sizeof(float)));
|
||||
glEnableVertexAttribArray(2);
|
||||
|
|
48
src/main.c
48
src/main.c
|
@ -10,12 +10,13 @@
|
|||
const int WIDTH = 420;
|
||||
const int HEIGHT = 420;
|
||||
|
||||
void updateUniforms(GLuint shaderProgram);
|
||||
void updateUniforms(GLuint shaderProgram, float t);
|
||||
|
||||
SDL_Window *window;
|
||||
|
||||
struct Shaders shaders;
|
||||
struct Textures textures;
|
||||
struct Epoch epoch;
|
||||
|
||||
void initialise()
|
||||
{
|
||||
|
@ -32,15 +33,29 @@ void initialise()
|
|||
createTextures(WIDTH, HEIGHT, shaders, &textures);
|
||||
}
|
||||
|
||||
int main()
|
||||
void parseArgs(int argc, char* argv[], struct Epoch* e)
|
||||
{
|
||||
// check we have the right number of arguments
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "usage: oglc TIMESPEED\n");
|
||||
}
|
||||
|
||||
sscanf(argv[1], "%f", &(e->speed));
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
parseArgs(argc, argv, &epoch);
|
||||
|
||||
initialise();
|
||||
|
||||
float start = now();
|
||||
float start = now(epoch);
|
||||
int frames;
|
||||
for (frames = 0; !checkQuit(); frames++)
|
||||
{
|
||||
GLuint shader;
|
||||
float t = now(epoch);
|
||||
|
||||
// prepass
|
||||
// TODO: write output to different texture than main output
|
||||
|
@ -48,18 +63,17 @@ int main()
|
|||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, textures.g0);
|
||||
glUseProgram(shader);
|
||||
updateUniforms(shader);
|
||||
updateUniforms(shader, t);
|
||||
glDispatchCompute((GLuint)WIDTH, (GLuint)HEIGHT, 1);
|
||||
|
||||
// make sure we're finished writing to the texture before trying to read it
|
||||
glMemoryBarrier(GL_ALL_BARRIER_BITS);
|
||||
|
||||
// dispatch compute shaders
|
||||
shader = shaders.lighting;
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, textures.target);
|
||||
glUseProgram(shader);
|
||||
updateUniforms(shader);
|
||||
updateUniforms(shader, t);
|
||||
//int loc = glGetUniformLocation(shader, "_g0");
|
||||
//glUniform1i(loc, textures.g0);
|
||||
glDispatchCompute((GLuint)WIDTH, (GLuint)HEIGHT, 1);
|
||||
|
@ -67,6 +81,18 @@ int main()
|
|||
// make sure we're finished writing to the texture before trying to read it
|
||||
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
|
||||
|
||||
// TODO: frame blending
|
||||
//
|
||||
// before we get to our normal rendering pass we need to blend our samples
|
||||
// across multiple frames. to do this, we should maintain an accumulation
|
||||
// buffer where we can store pixel data while a new frame is being generated.
|
||||
// this can be a collection of two buffers, where one is written to and the
|
||||
// other is read from. to render a new frame, the newly sampled raw frame can
|
||||
// be combined with data from the previous frame. by repeatedly taking the
|
||||
// average over a large number of frames a cleaner image can be generated.
|
||||
// this is most effective for static images, and will produce motion blur on
|
||||
// a moving image.
|
||||
|
||||
// normal drawing pass
|
||||
shader = shaders.quad;
|
||||
glUseProgram(shader);
|
||||
|
@ -78,7 +104,7 @@ int main()
|
|||
SDL_GL_SwapWindow(window);
|
||||
}
|
||||
|
||||
float elapsed = now()-start;
|
||||
float elapsed = now(epoch)-start;
|
||||
printf("%d frames in %fs [%f fps]\n",
|
||||
frames,
|
||||
elapsed,
|
||||
|
@ -87,7 +113,7 @@ int main()
|
|||
return 0;
|
||||
}
|
||||
|
||||
void updateUniforms(GLuint shaderProgram)
|
||||
void updateUniforms(GLuint shaderProgram, float t)
|
||||
{
|
||||
// update random values
|
||||
vec4 seed =
|
||||
|
@ -100,19 +126,17 @@ void updateUniforms(GLuint shaderProgram)
|
|||
int loc = glGetUniformLocation(shaderProgram, "_seed");
|
||||
glUniform4fv(loc, 1, seed);
|
||||
|
||||
// update time
|
||||
float t = now();
|
||||
float sin_t = sin(t);
|
||||
loc = glGetUniformLocation(shaderProgram, "_t");
|
||||
glUniform4f(loc, t, sin_t, (1.0 + sin_t)*0.5, 0.0f);
|
||||
|
||||
// update camera
|
||||
float aspect = (float)WIDTH/(float)HEIGHT;
|
||||
updateCameraUniforms(shaderProgram, aspect);
|
||||
updateCameraUniforms(shaderProgram, aspect, t);
|
||||
|
||||
// make and update spheres
|
||||
const int sphereCount = 42;
|
||||
struct Sphere spheres[sphereCount];
|
||||
makeSpheres(spheres, sphereCount);
|
||||
makeSpheres(spheres, sphereCount, t);
|
||||
updateSphereUniforms(shaderProgram, spheres, sphereCount);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
#include "sphere.h"
|
||||
|
||||
void makeSpheres(struct Sphere *spheres, int count)
|
||||
void makeSpheres(struct Sphere *spheres, int count, float t)
|
||||
{
|
||||
//float t = time();
|
||||
|
||||
vec3 albedos[] =
|
||||
{
|
||||
{0.0,0.0,1.0},
|
||||
|
@ -21,7 +19,6 @@ void makeSpheres(struct Sphere *spheres, int count)
|
|||
float x;
|
||||
vec3 sc = {0.0,0.0,1.0};
|
||||
|
||||
float t = now();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
x = 2.0*CGLM_PI * (float)i/(float)count;
|
||||
|
|
|
@ -16,7 +16,7 @@ struct Sphere
|
|||
int material;
|
||||
};
|
||||
|
||||
void makeSpheres(struct Sphere *spheres, int count);
|
||||
void makeSpheres(struct Sphere *spheres, int count, float t);
|
||||
struct Sphere makeSphere(vec3 center, float radius, vec3 albedo, int material);
|
||||
//void updateSphereUniform(GLuint shaderProgram, struct Sphere sphere);
|
||||
void updateSphereUniforms(GLuint shaderProgram, struct Sphere *spheres, int count);
|
||||
|
|
Loading…
Reference in New Issue