Skip to content

Commit 9296a2e

Browse files
New PRNG and some minor structural changes
1 parent 723df1f commit 9296a2e

17 files changed

+65
-139
lines changed

src/Main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,14 @@ bool InitRenderer()
114114
return true;
115115
}
116116

117-
// TODO: Fix occassional crashes when saving screenshot
118117
void SaveFrame(const std::string filename)
119118
{
120119
unsigned char* data = nullptr;
121120
int w, h;
122121
renderer->GetOutputBuffer(&data, w, h);
123122
stbi_flip_vertically_on_write(true);
124123
stbi_write_png(filename.c_str(), w, h, 3, data, w*3);
124+
printf("Frame saved: %s\n", filename.c_str());
125125
delete data;
126126
}
127127

src/core/Program.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ namespace GLSLPT
3434
glAttachShader(object, shaders[i].getObject());
3535

3636
glLinkProgram(object);
37-
printf("Linking program %d\n", int(object));
3837
for (unsigned i = 0; i < shaders.size(); i++)
3938
glDetachShader(object, shaders[i].getObject());
4039
GLint success = 0;

src/core/Renderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace GLSLPT
5050
RRDepth = 2;
5151
bgColor = Vec3(0.3f, 0.3f, 0.3f);
5252
denoiserFrameCnt = 20;
53-
enableDenoiser = true;
53+
enableDenoiser = false;
5454
}
5555
iVec2 resolution;
5656
int maxDepth;

src/core/Shader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace GLSLPT
3232
Shader::Shader(const ShaderInclude::ShaderSource& sourceObj, GLenum shaderType)
3333
{
3434
object = glCreateShader(shaderType);
35-
printf("Compiling Shader %s -> %d\n", sourceObj.path.c_str(), int(object));
35+
printf("Compiling Shader %s\n", sourceObj.path.c_str());
3636
const GLchar *src = (const GLchar *)sourceObj.src.c_str();
3737
glShaderSource(object, 1, &src, 0);
3838
glCompileShader(object);

src/core/TiledRenderer.cpp

Lines changed: 32 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ namespace GLSLPT
4141
, outputFBO(0)
4242
, pathTraceShader(nullptr)
4343
, pathTraceShaderLowRes(nullptr)
44-
, accumShader(nullptr)
4544
, outputShader(nullptr)
4645
, tonemapShader(nullptr)
4746
, pathTraceTexture(0)
@@ -50,8 +49,8 @@ namespace GLSLPT
5049
, tileOutputTexture()
5150
, tileX(-1)
5251
, tileY(-1)
53-
, numTilesX(-1)
54-
, numTilesY(-1)
52+
, numTilesX(5)
53+
, numTilesY(5)
5554
, currentBuffer(0)
5655
, sampleCounter(0)
5756
{
@@ -85,8 +84,7 @@ namespace GLSLPT
8584

8685
ShaderInclude::ShaderSource vertexShaderSrcObj = ShaderInclude::load(shadersDirectory + "common/vertex.glsl");
8786
ShaderInclude::ShaderSource pathTraceShaderSrcObj = ShaderInclude::load(shadersDirectory + "tiled.glsl");
88-
ShaderInclude::ShaderSource pathTraceShaderLowResSrcObj = ShaderInclude::load(shadersDirectory + "progressive.glsl");
89-
ShaderInclude::ShaderSource accumShaderSrcObj = ShaderInclude::load(shadersDirectory + "accumulation.glsl");
87+
ShaderInclude::ShaderSource pathTraceShaderLowResSrcObj = ShaderInclude::load(shadersDirectory + "preview.glsl");
9088
ShaderInclude::ShaderSource outputShaderSrcObj = ShaderInclude::load(shadersDirectory + "output.glsl");
9189
ShaderInclude::ShaderSource tonemapShaderSrcObj = ShaderInclude::load(shadersDirectory + "tonemap.glsl");
9290

@@ -123,16 +121,16 @@ namespace GLSLPT
123121

124122
pathTraceShader = LoadShaders(vertexShaderSrcObj, pathTraceShaderSrcObj);
125123
pathTraceShaderLowRes = LoadShaders(vertexShaderSrcObj, pathTraceShaderLowResSrcObj);
126-
accumShader = LoadShaders(vertexShaderSrcObj, accumShaderSrcObj);
127124
outputShader = LoadShaders(vertexShaderSrcObj, outputShaderSrcObj);
128125
tonemapShader = LoadShaders(vertexShaderSrcObj, tonemapShaderSrcObj);
129126

130-
printf("Debug sizes : %d %d - %d %d\n", tileWidth, tileHeight, screenSize.x, screenSize.y);
127+
printf("Screen Resolution : %d %d\n", screenSize.x, screenSize.y);
128+
printf("Preview Resolution : %d %d\n", tileWidth, tileHeight);
131129
//----------------------------------------------------------
132130
// FBO Setup
133131
//----------------------------------------------------------
134132
//Create FBOs for path trace shader (Tiled)
135-
printf("Buffer pathTraceFBO\n");
133+
printf("Creating pathTraceFBO\n");
136134
glGenFramebuffers(1, &pathTraceFBO);
137135
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBO);
138136

@@ -145,8 +143,8 @@ namespace GLSLPT
145143
glBindTexture(GL_TEXTURE_2D, 0);
146144
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pathTraceTexture, 0);
147145

148-
//Create FBOs for path trace shader (Progressive)
149-
printf("Buffer pathTraceFBOLowRes\n");
146+
//Create FBOs for low res preview shader
147+
printf("Creating pathTraceFBOLowRes\n");
150148
glGenFramebuffers(1, &pathTraceFBOLowRes);
151149
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBOLowRes);
152150

@@ -162,7 +160,7 @@ namespace GLSLPT
162160
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pathTraceTextureLowRes, 0);
163161

164162
//Create FBOs for accum buffer
165-
printf("Buffer accumFBO\n");
163+
printf("Creating accumFBO\n");
166164
glGenFramebuffers(1, &accumFBO);
167165
glBindFramebuffer(GL_FRAMEBUFFER, accumFBO);
168166

@@ -176,7 +174,7 @@ namespace GLSLPT
176174
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, accumTexture, 0);
177175

178176
//Create FBOs for tile output shader
179-
printf("Buffer outputFBO\n");
177+
printf("Creating outputFBO\n");
180178
glGenFramebuffers(1, &outputFBO);
181179
glBindFramebuffer(GL_FRAMEBUFFER, outputFBO);
182180

@@ -300,7 +298,6 @@ namespace GLSLPT
300298

301299
delete pathTraceShader;
302300
delete pathTraceShaderLowRes;
303-
delete accumShader;
304301
delete outputShader;
305302
delete tonemapShader;
306303

@@ -319,74 +316,55 @@ namespace GLSLPT
319316
}
320317

321318
glActiveTexture(GL_TEXTURE0);
322-
glBindTexture(GL_TEXTURE_2D, accumTexture);
323-
324-
if (!scene->camera->isMoving)
319+
320+
if (scene->camera->isMoving || scene->instancesModified)
321+
{
322+
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBOLowRes);
323+
glViewport(0, 0, screenSize.x * pixelRatio, screenSize.y * pixelRatio);
324+
quad->Draw(pathTraceShaderLowRes);
325+
scene->instancesModified = false;
326+
}
327+
else
325328
{
326-
// If instances are moved then render to low res buffer once to avoid ghosting from previous frame
327-
if (scene->instancesModified)
328-
{
329-
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBOLowRes);
330-
glViewport(0, 0, screenSize.x * pixelRatio, screenSize.y * pixelRatio);
331-
quad->Draw(pathTraceShaderLowRes);
332-
scene->instancesModified = false;
333-
}
334-
335-
GLuint shaderObject;
336-
pathTraceShader->Use();
337-
338-
shaderObject = pathTraceShader->getObject();
339-
glUniform1i(glGetUniformLocation(shaderObject, "tileX"), tileX);
340-
glUniform1i(glGetUniformLocation(shaderObject, "tileY"), tileY);
341-
pathTraceShader->StopUsing();
342-
343329
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBO);
344330
glViewport(0, 0, tileWidth, tileHeight);
331+
glBindTexture(GL_TEXTURE_2D, accumTexture);
345332
quad->Draw(pathTraceShader);
346333

347334
glBindFramebuffer(GL_FRAMEBUFFER, accumFBO);
348335
glViewport(tileWidth * tileX, tileHeight * tileY, tileWidth, tileHeight);
349-
glActiveTexture(GL_TEXTURE0);
350336
glBindTexture(GL_TEXTURE_2D, pathTraceTexture);
351-
quad->Draw(accumShader);
337+
quad->Draw(outputShader);
352338

353339
glBindFramebuffer(GL_FRAMEBUFFER, outputFBO);
354340
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tileOutputTexture[currentBuffer], 0);
355341
glViewport(0, 0, screenSize.x, screenSize.y);
356-
glActiveTexture(GL_TEXTURE0);
357342
glBindTexture(GL_TEXTURE_2D, accumTexture);
358343
quad->Draw(tonemapShader);
359344
}
360-
else
361-
{
362-
glBindFramebuffer(GL_FRAMEBUFFER, pathTraceFBOLowRes);
363-
glViewport(0, 0, screenSize.x * pixelRatio, screenSize.y * pixelRatio);
364-
quad->Draw(pathTraceShaderLowRes);
365-
}
366345
}
367346

368347
void TiledRenderer::Present() const
369348
{
370349
if (!initialized)
371350
return;
372351

373-
if (!scene->camera->isMoving)
374-
{
375-
glActiveTexture(GL_TEXTURE0);
352+
glActiveTexture(GL_TEXTURE0);
376353

354+
if (scene->camera->isMoving || sampleCounter == 1)
355+
{
356+
glBindTexture(GL_TEXTURE_2D, pathTraceTextureLowRes);
357+
quad->Draw(tonemapShader);
358+
}
359+
else
360+
{
377361
if (scene->renderOptions.enableDenoiser && denoised)
378362
glBindTexture(GL_TEXTURE_2D, denoisedTexture);
379363
else
380364
glBindTexture(GL_TEXTURE_2D, tileOutputTexture[1 - currentBuffer]);
381-
365+
382366
quad->Draw(outputShader);
383367
}
384-
else
385-
{
386-
glActiveTexture(GL_TEXTURE0);
387-
glBindTexture(GL_TEXTURE_2D, pathTraceTextureLowRes);
388-
quad->Draw(tonemapShader);
389-
}
390368
}
391369

392370
float TiledRenderer::GetProgress() const
@@ -436,7 +414,7 @@ namespace GLSLPT
436414
oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter
437415
filter.setImage("color", denoiserInputFramePtr, oidn::Format::Float3, screenSize.x, screenSize.y);
438416
filter.setImage("output", frameOutputPtr, oidn::Format::Float3, screenSize.x, screenSize.y);
439-
filter.set("hdr", false); // image is HDR
417+
filter.set("hdr", false);
440418
filter.commit();
441419

442420
// Filter the image
@@ -455,7 +433,6 @@ namespace GLSLPT
455433

456434
if (scene->camera->isMoving || scene->instancesModified)
457435
{
458-
r1 = r2 = r3 = 0;
459436
tileX = -1;
460437
tileY = numTilesY - 1;
461438
sampleCounter = 1;
@@ -466,19 +443,6 @@ namespace GLSLPT
466443
glViewport(0, 0, screenSize.x, screenSize.y);
467444
glClear(GL_COLOR_BUFFER_BIT);
468445

469-
glBindFramebuffer(GL_FRAMEBUFFER, outputFBO);
470-
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tileOutputTexture[1 - currentBuffer], 0);
471-
glViewport(0, 0, screenSize.x, screenSize.y);
472-
glActiveTexture(GL_TEXTURE0);
473-
glBindTexture(GL_TEXTURE_2D, pathTraceTextureLowRes);
474-
quad->Draw(tonemapShader);
475-
476-
/*glBindFramebuffer(GL_FRAMEBUFFER, accumFBO);
477-
glViewport(0, 0, screenSize.x, screenSize.y);
478-
glActiveTexture(GL_TEXTURE0);
479-
glBindTexture(GL_TEXTURE_2D, pathTraceTextureLowRes);
480-
quad->Draw(accumShader);*/
481-
482446
glBindFramebuffer(GL_FRAMEBUFFER, 0);
483447
}
484448
else
@@ -497,10 +461,6 @@ namespace GLSLPT
497461
currentBuffer = 1 - currentBuffer;
498462
}
499463
}
500-
501-
r1 = ((float)rand() / (RAND_MAX));
502-
r2 = ((float)rand() / (RAND_MAX));
503-
r3 = ((float)rand() / (RAND_MAX));
504464
}
505465

506466
GLuint shaderObject;
@@ -514,13 +474,13 @@ namespace GLSLPT
514474
glUniform1f(glGetUniformLocation(shaderObject, "camera.fov"), scene->camera->fov);
515475
glUniform1f(glGetUniformLocation(shaderObject, "camera.focalDist"), scene->camera->focalDist);
516476
glUniform1f(glGetUniformLocation(shaderObject, "camera.aperture"), scene->camera->aperture);
517-
glUniform3f(glGetUniformLocation(shaderObject, "randomVector"), r1, r2, r3);
518477
glUniform1i(glGetUniformLocation(shaderObject, "useEnvMap"), scene->hdrData == nullptr ? false : scene->renderOptions.useEnvMap);
519478
glUniform1f(glGetUniformLocation(shaderObject, "hdrMultiplier"), scene->renderOptions.hdrMultiplier);
520479
glUniform1i(glGetUniformLocation(shaderObject, "maxDepth"), scene->renderOptions.maxDepth);
521480
glUniform1i(glGetUniformLocation(shaderObject, "tileX"), tileX);
522481
glUniform1i(glGetUniformLocation(shaderObject, "tileY"), tileY);
523482
glUniform3f(glGetUniformLocation(shaderObject, "bgColor"), scene->renderOptions.bgColor.x, scene->renderOptions.bgColor.y, scene->renderOptions.bgColor.z);
483+
glUniform1i(glGetUniformLocation(shaderObject, "frame"), frameCounter);
524484
pathTraceShader->StopUsing();
525485

526486
pathTraceShaderLowRes->Use();

src/core/TiledRenderer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ namespace GLSLPT
4242
// Shaders
4343
Program* pathTraceShader;
4444
Program* pathTraceShaderLowRes;
45-
Program* accumShader;
4645
Program* outputShader;
4746
Program* tonemapShader;
4847

src/loaders/Loader.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ namespace GLSLPT
9696
if (strchr(line, '}'))
9797
break;
9898

99-
sscanf(line, " name %s", name);
10099
sscanf(line, " color %f %f %f", &material.albedo.x, &material.albedo.y, &material.albedo.z);
101100
sscanf(line, " emission %f %f %f", &material.emission.x, &material.emission.y, &material.emission.z);
102101
sscanf(line, " metallic %f", &material.metallic);

src/shaders/accumulation.glsl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@
2424

2525
#version 330
2626

27-
precision highp float;
28-
precision highp int;
29-
precision highp sampler2D;
30-
precision highp samplerCube;
31-
precision highp isampler2D;
32-
precision highp sampler2DArray;
33-
3427
out vec4 color;
3528
in vec2 TexCoords;
3629

src/shaders/common/globals.glsl

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,13 @@
2525
#define PI 3.14159265358979323
2626
#define TWO_PI 6.28318530717958648
2727
#define INFINITY 1000000.0
28-
#define EPS 0.0001
28+
#define EPS 0.001
2929

3030
#define QUAD_LIGHT 0
3131
#define SPHERE_LIGHT 1
3232
#define DISTANT_LIGHT 2
3333

3434
mat4 transform;
35-
36-
vec2 seed;
3735
vec3 tempTexCoords;
3836

3937
struct Ray
@@ -101,7 +99,6 @@ struct State
10199
vec3 bitangent;
102100

103101
bool isEmitter;
104-
bool specularBounce;
105102

106103
vec2 texCoord;
107104
vec3 bary;
@@ -128,10 +125,29 @@ struct LightSampleRec
128125

129126
uniform Camera camera;
130127

128+
//RNG from code by Moroz Mykhailo (https://www.shadertoy.com/view/wltcRS)
129+
130+
//internal RNG state
131+
uvec4 seed;
132+
ivec2 pixel;
133+
134+
void InitRNG(vec2 p, int frame)
135+
{
136+
pixel = ivec2(p);
137+
seed = uvec4(p, uint(frame), uint(p.x) + uint(p.y));
138+
}
139+
140+
void pcg4d(inout uvec4 v)
141+
{
142+
v = v * 1664525u + 1013904223u;
143+
v.x += v.y * v.w; v.y += v.z * v.x; v.z += v.x * v.y; v.w += v.y * v.z;
144+
v = v ^ (v >> 16u);
145+
v.x += v.y * v.w; v.y += v.z * v.x; v.z += v.x * v.y; v.w += v.y * v.z;
146+
}
147+
131148
float rand()
132149
{
133-
seed -= randomVector.xy;
134-
return fract(sin(dot(seed, vec2(12.9898, 78.233))) * 43758.5453);
150+
pcg4d(seed); return float(seed.x) / float(0xffffffffu);
135151
}
136152

137153
vec3 FaceForward(vec3 a, vec3 b)

src/shaders/common/pathtrace.glsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ vec3 PathTrace(Ray r)
231231
LightSampleRec lightSampleRec;
232232
BsdfSampleRec bsdfSampleRec;
233233
vec3 absorption = vec3(0.0);
234-
state.specularBounce = false;
235234

236235
for (int depth = 0; depth < maxDepth; depth++)
237236
{
@@ -248,7 +247,7 @@ vec3 PathTrace(Ray r)
248247
float misWeight = 1.0f;
249248
vec2 uv = vec2((PI + atan(r.direction.z, r.direction.x)) * (1.0 / TWO_PI), acos(r.direction.y) * (1.0 / PI));
250249

251-
if (depth > 0 && !state.specularBounce)
250+
if (depth > 0)
252251
{
253252
// TODO: Fix NaNs when using certain HDRs
254253
float lightPdf = EnvPdf(r);

0 commit comments

Comments
 (0)