Commit 548711c1 authored by Dario Seyb's avatar Dario Seyb

getting somewhere

parent 28f2a923
This diff is collapsed.
#version 410 core
layout(vertices = 3) out;
in vec3 vPosition[];
in vec2 vTexCoord[];
in vec3 vNormal[];
out vec3 tNormal[];
out vec2 tTexCoord[];
out vec3 tPosition[];
//patch out vec3 tPosition;
//patch out vec3 tNormal;
//patch out vec2 tTexCoord;
#define ID gl_InvocationID
void main(){
tNormal[ID] = vNormal[ID];
tTexCoord[ID] = vTexCoord[ID];
tPosition[ID] = vPosition[ID];
if (ID == 0) {
gl_TessLevelInner[0] = 1;
gl_TessLevelOuter[0] = 1;
gl_TessLevelOuter[1] = 1;
gl_TessLevelOuter[2] = 1;
}
}
#version 410 core
layout(triangles, equal_spacing, ccw) in;
in vec2 tTexCoord[];
in vec3 tNormal[];
in vec3 tPosition[];
out vec3 teNormal;
out vec2 teTexCoord;
out vec3 tePosition;
uniform mat4 uViewProjectionMatrix;
uniform mat4 uModelMatrix;
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2){
return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
}
vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2){
return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2;
}
void main(){
teNormal = interpolate3D(tNormal[0], tNormal[1], tNormal[2]);
teNormal = normalize(teNormal);
teTexCoord = interpolate2D(tTexCoord[0], tTexCoord[1], tTexCoord[2]);
tePosition = interpolate3D(tPosition[0], tPosition[1], tPosition[2]);
gl_Position = uViewProjectionMatrix * vec4(tePosition, 1.0);
}
......@@ -56,6 +56,7 @@ void main()
oColor = color;
oEmissive = emissive();
oSpecularSmoothness = specularSmoothness();
oNormalMotion.xy = normalize(normal()).xy;
vec3 n = normal();
oNormalMotion.xy = vec2(atan(n.y,n.x)/M_PI, n.z);
oNormalMotion.zw = (thisFragCoord-prevFragCoord)*0.5;
}
#version 410 core
uniform mat4 uModelMatrix;
uniform mat4 uInverseModelMatrix;
uniform mat4 uViewProjectionMatrix;
uniform float uFar;
......
#version 410 core
in vec3 teNormal;
in vec2 teTexCoord;
in vec3 tePosition;
in vec3 vNormal;
in vec2 vTexCoord;
in vec3 vPosition;
uniform sampler2D uSamplerDepth;
......@@ -13,7 +13,7 @@ uniform bool uHasNormalMap;
uniform sampler2D uNormalMap;
uniform bool uHasSpecularSmoothnessMap;
uniform sampler2D uSpecularSmoothnessMap;
uniform sampler3D uSpecularSmoothnessMap;
uniform vec4 uEmissiveColor;
uniform vec4 uTintColor;
......@@ -38,9 +38,6 @@ vec3 normal();
void main()
{
vec4 thisPosition = uViewProjectionMatrix * vec4(tePosition, 1);
vec4 color = color();
oColor = color;
}
......@@ -79,6 +79,7 @@ void main()
vec4 emissive = texture(uSamplerEmissive, vTexCoord);
vec3 normal = unpackNormal(texture(uSamplerNormalMotion, vTexCoord));
float depth = unpackDepth(texture(uSamplerDepth, vTexCoord).r);
if(depth == 1) discard;
......@@ -102,6 +103,6 @@ void main()
albedo.rgb = EnergyConservationBetweenDiffuseAndSpecular (albedo.rgb, specularSmoothness.rgb, /*out*/ oneMinusReflectivity);
float lightNdotL = max(0, dot(lightDir, normal));
vec4 lighting = BRDF (albedo.rgb, specularSmoothness.rgb, oneMinusReflectivity, specularSmoothness.a, normal, viewDir, lightDir, lightNdotL, uLightColor.rgb * uLightColor.a);
vec4 lighting = BRDF (albedo.rgb, specularSmoothness.rgb, oneMinusReflectivity, specularSmoothness.a, normal, viewDir, lightDir, lightNdotL, uLightColor.rgb * uLightColor.a);
oColor = vec4(lighting.rgb * shadowFactor(worldPosition) + emissive.rgb, uOneOverLightCount * albedo.a);
}
......@@ -2,5 +2,9 @@
#define M_PI 3.1415926535897932384626433832795
vec3 unpackNormal(vec4 normalMotion) {
return normalize(vec3(normalMotion.xy, sqrt(1.0 - normalMotion.x*normalMotion.x - normalMotion.y*normalMotion.y)));
vec2 ang = normalMotion.xy;
vec2 scth = vec2(sin(ang.x * M_PI), cos(ang.x * M_PI));
//sincos(ang.x * M_PI, scth.x, scth.y);
vec2 scphi = vec2(sqrt(1.0 - ang.y*ang.y), ang.y);
return vec3(scth.y*scphi.x, scth.x*scphi.x, scphi.y);
}
\ No newline at end of file
......@@ -7,19 +7,23 @@ in vec3 gPosInModelspace;
vec3 approxNormal;
bool isWater;
vec3 pos;
void initShader() {
if (texture_getFinalHeight(gPosInModelspace) < texture_water_getWaterLevelHeightAt(gPosInModelspace)) {
pos = gPosInModelspace;
if (texture_getFinalHeight(pos) < texture_water_getWaterLevelHeightAt(pos)) {
//water visible:
isWater = true;
approxNormal = approximateWaterNormal(normalize(gPosInModelspace));
approxNormal = approximateWaterNormal(normalize(pos));
} else {
//land visible:
isWater = false;
approxNormal = approximateTerrainNormal(normalize(gPosInModelspace));
approxNormal = approximateTerrainNormal(normalize(pos));
}
approxNormal = normalize(approxNormal);
}
float amplify(float d, float scale, float offset){
......@@ -37,12 +41,9 @@ vec4 color() {
if (isWater) {
color = vec4(0., 0.2, 1., 1.);
} else {
color = texture_getColor(gPosInModelspace, gNormal, approxNormal);
color = texture_getColor(pos, gNormal, approxNormal);
}
/*float d1 = min(min(gTriDistance.x, gTriDistance.y), gTriDistance.z);
float d2 = min(min(gPatchDistance.x, gPatchDistance.y), gPatchDistance.z);
color = amplify(d1, 80, -0.5) * amplify(d2, 120, -0.5) * color;*/
color.a = 1.0;
return color;
}
......@@ -50,7 +51,7 @@ vec4 color() {
vec4 emissive() {
//return uEmissiveColor;
if (isWater) {
return vec4(0., 0., .8, 1.);
return vec4(0., 0., 0.01, 1.);
} else {
return vec4(0., 0., 0., 1.);
}
......
......@@ -51,11 +51,8 @@ void main(){
tcTexCoord[ID] = vTexCoord[ID];
tcPosition[ID] = vPosition[ID];
if (ID == 0) {
float d0 = distance(cameraPosition, (uModelMatrix * vec4(tcPosition[0], 1)).xyz );
//if (ID == 0) {
float d0 = distance(cameraPosition, (uModelMatrix * vec4(tcPosition[0], 1)).xyz );
float d1 = distance(cameraPosition, (uModelMatrix * vec4(tcPosition[1], 1)).xyz );
float d2 = distance(cameraPosition, (uModelMatrix * vec4(tcPosition[2], 1)).xyz );
......@@ -63,29 +60,5 @@ void main(){
gl_TessLevelOuter[1] = getTessLevel(d2, d0);
gl_TessLevelOuter[2] = getTessLevel(d0, d1);
gl_TessLevelInner[0] = 0.5 * gl_TessLevelOuter[2];
/*
float avgDist = (d0 + d1 + d2)/3.0;
vec3 midPoint;
float fDistance;
midPoint = (tcPosition[2] + tcPosition[0] / 2.0);
fDistance = distance(midPoint, cameraPosition) * 1;
gl_TessLevelOuter[0] = getTessLevel(fDistance, fDistance);
midPoint = (tcPosition[2] + tcPosition[0] / 2.0);
fDistance = distance(midPoint, cameraPosition) * 1;
gl_TessLevelOuter[1] = getTessLevel(fDistance, fDistance);
midPoint = (tcPosition[2] + tcPosition[0] / 2.0);
fDistance = distance(midPoint, cameraPosition) * 1;
gl_TessLevelOuter[2] = getTessLevel(fDistance, fDistance);
gl_TessLevelInner[0] = (gl_TessLevelOuter[0] + gl_TessLevelOuter[1] +gl_TessLevelOuter[2]) /3;
*/
}
//}
}
......@@ -24,170 +24,6 @@ uniform mat4 uViewProjectionMatrix;
uniform mat4 uModelMatrix;
uniform vec3 cameraPostion;
//vec3 mod289(vec3 x)
//{
// return x - floor(x * (1.0 / 289.0)) * 289.0;
//}
//vec4 mod289(vec4 x)
//{
// return x - floor(x * (1.0 / 289.0)) * 289.0;
//}
//vec4 permute(vec4 x)
//{
// return mod289(((x*34.0)+1.0)*x);
//}
//vec4 taylorInvSqrt(vec4 r)
//{
// return 1.79284291400159 - 0.85373472095314 * r;
//}
//vec3 fade(vec3 t) {
// return t*t*t*(t*(t*6.0-15.0)+10.0);
//}
//// Classic Perlin noise
//float cnoise(vec3 P)
//{
// vec3 Pi0 = floor(P); // Integer part for indexing
// vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1
// Pi0 = mod289(Pi0);
// Pi1 = mod289(Pi1);
// vec3 Pf0 = fract(P); // Fractional part for interpolation
// vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0
// vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
// vec4 iy = vec4(Pi0.yy, Pi1.yy);
// vec4 iz0 = Pi0.zzzz;
// vec4 iz1 = Pi1.zzzz;
// vec4 ixy = permute(permute(ix) + iy);
// vec4 ixy0 = permute(ixy + iz0);
// vec4 ixy1 = permute(ixy + iz1);
// vec4 gx0 = ixy0 * (1.0 / 7.0);
// vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
// gx0 = fract(gx0);
// vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
// vec4 sz0 = step(gz0, vec4(0.0));
// gx0 -= sz0 * (step(0.0, gx0) - 0.5);
// gy0 -= sz0 * (step(0.0, gy0) - 0.5);
// vec4 gx1 = ixy1 * (1.0 / 7.0);
// vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
// gx1 = fract(gx1);
// vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
// vec4 sz1 = step(gz1, vec4(0.0));
// gx1 -= sz1 * (step(0.0, gx1) - 0.5);
// gy1 -= sz1 * (step(0.0, gy1) - 0.5);
// vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
// vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
// vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
// vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
// vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
// vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
// vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
// vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
// vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
// g000 *= norm0.x;
// g010 *= norm0.y;
// g100 *= norm0.z;
// g110 *= norm0.w;
// vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
// g001 *= norm1.x;
// g011 *= norm1.y;
// g101 *= norm1.z;
// g111 *= norm1.w;
// float n000 = dot(g000, Pf0);
// float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
// float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
// float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
// float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
// float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
// float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
// float n111 = dot(g111, Pf1);
// vec3 fade_xyz = fade(Pf0);
// vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
// vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
// float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
// return 2.2 * n_xyz;
//}
//// Classic Perlin noise, periodic variant
//float pnoise(vec3 P, vec3 rep)
//{
// vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period
// vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period
// Pi0 = mod289(Pi0);
// Pi1 = mod289(Pi1);
// vec3 Pf0 = fract(P); // Fractional part for interpolation
// vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0
// vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
// vec4 iy = vec4(Pi0.yy, Pi1.yy);
// vec4 iz0 = Pi0.zzzz;
// vec4 iz1 = Pi1.zzzz;
// vec4 ixy = permute(permute(ix) + iy);
// vec4 ixy0 = permute(ixy + iz0);
// vec4 ixy1 = permute(ixy + iz1);
// vec4 gx0 = ixy0 * (1.0 / 7.0);
// vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
// gx0 = fract(gx0);
// vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
// vec4 sz0 = step(gz0, vec4(0.0));
// gx0 -= sz0 * (step(0.0, gx0) - 0.5);
// gy0 -= sz0 * (step(0.0, gy0) - 0.5);
// vec4 gx1 = ixy1 * (1.0 / 7.0);
// vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
// gx1 = fract(gx1);
// vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
// vec4 sz1 = step(gz1, vec4(0.0));
// gx1 -= sz1 * (step(0.0, gx1) - 0.5);
// gy1 -= sz1 * (step(0.0, gy1) - 0.5);
// vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
// vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
// vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
// vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
// vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
// vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
// vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
// vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
// vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
// g000 *= norm0.x;
// g010 *= norm0.y;
// g100 *= norm0.z;
// g110 *= norm0.w;
// vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
// g001 *= norm1.x;
// g011 *= norm1.y;
// g101 *= norm1.z;
// g111 *= norm1.w;
// float n000 = dot(g000, Pf0);
// float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
// float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
// float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
// float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
// float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
// float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
// float n111 = dot(g111, Pf1);
// vec3 fade_xyz = fade(Pf0);
// vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
// vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
// float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
// return 2.2 * n_xyz;
//}
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2){
return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
......
......@@ -18,7 +18,8 @@ private:
RendererSystem *m_renderer;
Geometry defaultGeom;
Geometry orbitTorus;
Geometry atmosphereGeom;
Geometry orbitTorus;
Geometry minimapItem;
Material planetMat;
......
......@@ -245,7 +245,8 @@ void RendererSystem::render(RenderPass& pass, double interp, double totalTime) {
currentOffset.z = 0;
aaProj = glm::perspectiveFov<float>(glm::radians(cam->fov), windowSize.x, windowSize.y, cam->near, cam->far);
glm::mat4 viewProjectionMatrix = glm::translate(currentOffset) * aaProj * glm::inverse(camTransform);
glm::mat4 viewProjectionMatrixNoOffset = aaProj * glm::inverse(camTransform);
glm::mat4 viewProjectionMatrix = glm::translate(currentOffset) * viewProjectionMatrixNoOffset;
glm::mat4 prevViewProjectionMatrix = glm::translate(currentOffset) * aaProj * static_cast<glm::mat4>(glm::inverse(trans->lastRenderTransform));
m_lastGBufferRenderSetupTime = 0;
......@@ -507,59 +508,7 @@ void RendererSystem::render(RenderPass& pass, double interp, double totalTime) {
m_lastGBufferResolveTime = (double)(SDL_GetPerformanceCounter() - counterStart) * 1000.0 / SDL_GetPerformanceFrequency();
counterStart = SDL_GetPerformanceCounter();
// Transparent rendering
glEnable(GL_DEPTH_TEST);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_FRONT);
for (size_t i = 0; i < pass.submittedDrawCallsTransparent.size(); i++) {
auto& drawCall = pass.submittedDrawCallsTransparent[i];
drawCall.material.prog->use();
drawCall.material.prog->setTexture("uSamplerDepth", m_depthBuffer, 0);
if (drawCall.material.mainTexture) {
drawCall.material.prog->setTexture("uTexture", drawCall.material.mainTexture, 1);
drawCall.material.prog->setUniform("uHasAlbedoMap", true);
} else {
drawCall.material.prog->setUniform("uHasAlbedoMap", false);
}
if (drawCall.material.normalTexture) {
drawCall.material.prog->setTexture("uNormalMap", drawCall.material.normalTexture, 2);
drawCall.material.prog->setUniform("uHasNormalMap", true);
} else {
drawCall.material.prog->setUniform("uHasNormalMap", false);
}
if (drawCall.material.specularSmoothnessTexture) {
drawCall.material.prog->setTexture("uSpecularSmoothnessMap", drawCall.material.specularSmoothnessTexture, 3);
drawCall.material.prog->setUniform("uHasSpecularSmoothnessMap", true);
} else {
drawCall.material.prog->setUniform("uHasSpecularSmoothnessMap", false);
}
drawCall.material.prog->setUniform("uFar", cam->far);
drawCall.material.prog->setUniform("uTime", (float)totalTime);
drawCall.material.prog->setUniform("uTintColor", drawCall.material.tintColor);
drawCall.material.prog->setUniform("uEmissiveColor", drawCall.material.emissiveColor);
drawCall.material.prog->setUniform("uOneOverScreenSize", 1.0f / compositingRes);
drawCall.material.prog->setUniform("uModelMatrix", static_cast<glm::mat4>(drawCall.thisRenderTransform));
drawCall.material.prog->setUniform("uViewProjectionMatrix", viewProjectionMatrix);
drawCall.material.prog->setUniform("uViewProjectionInverseMatrix", invViewProj);
glm::vec3 pos = { drawCall.thisRenderTransform[3][0], drawCall.thisRenderTransform[3][1], drawCall.thisRenderTransform[3][2] };
drawCall.material.prog->setUniform("uObjectPosition", pos);
drawCall.material.prog->setUniform("uCameraPosition", camPos);
drawCall.material.prog->setUniform("uSunDir", pass.submittedLights[0].dir);
drawCall.material.prog->setUniform("uPrevModelMatrix", static_cast<glm::mat4>(drawCall.lastRenderTransform));
drawCall.material.prog->setUniform("uPrevViewProjectionMatrix", prevViewProjectionMatrix);
drawCall.geometry.vao->render();
}
glDisable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
// TXAA
glDisable(GL_BLEND);
......@@ -603,6 +552,77 @@ void RendererSystem::render(RenderPass& pass, double interp, double totalTime) {
0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // create 2 triangles (defined in shader) with no attributes
if (pass.submittedDrawCallsTransparent.size() > 0) {
m_secondaryCompositingBuffer->bind();
glDisable(GL_BLEND);
m_passBlitProgram->use();
m_passBlitProgram->setTexture(
"uSamplerColor", m_primaryCompositingBuffer->getColorAttachments()[0].texture,
0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // create 2 triangles (defined in shader) with no attributes
#if 1
// Transparent rendering
//glBlendFuncSeparate(GL_ONE, GL_ONE, GL_SRC_ALPHA, GL_ONE);
glCullFace(GL_FRONT);
for (size_t i = 0; i < pass.submittedDrawCallsTransparent.size(); i++) {
auto& drawCall = pass.submittedDrawCallsTransparent[i];
drawCall.material.prog->use();
drawCall.material.prog->setTexture("uSamplerDepth", m_depthBuffer, 0);
drawCall.material.prog->setTexture("uSamplerColor", m_primaryCompositingBuffer->getColorAttachments()[0].texture, 1);
if (drawCall.material.mainTexture) {
drawCall.material.prog->setTexture("uTexture", drawCall.material.mainTexture, 2);
drawCall.material.prog->setUniform("uHasAlbedoMap", true);
} else {
drawCall.material.prog->setUniform("uHasAlbedoMap", false);
}
if (drawCall.material.normalTexture) {
drawCall.material.prog->setTexture("uNormalMap", drawCall.material.normalTexture, 3);
drawCall.material.prog->setUniform("uHasNormalMap", true);
} else {
drawCall.material.prog->setUniform("uHasNormalMap", false);
}
if (drawCall.material.specularSmoothnessTexture) {
drawCall.material.prog->setTexture("uSpecularSmoothnessMap", drawCall.material.specularSmoothnessTexture, 4);
drawCall.material.prog->setUniform("uHasSpecularSmoothnessMap", true);
} else {
drawCall.material.prog->setUniform("uHasSpecularSmoothnessMap", false);
}
drawCall.material.prog->setUniform("uFar", cam->far);
drawCall.material.prog->setUniform("uTime", (float)totalTime);
drawCall.material.prog->setUniform("uTintColor", drawCall.material.tintColor);
drawCall.material.prog->setUniform("uEmissiveColor", drawCall.material.emissiveColor);
drawCall.material.prog->setUniform("uOneOverScreenSize", 1.0f / compositingRes);
drawCall.material.prog->setUniform("uModelMatrix", static_cast<glm::mat4>(drawCall.thisRenderTransform));
drawCall.material.prog->setUniform("uViewProjectionMatrix", viewProjectionMatrixNoOffset);
drawCall.material.prog->setUniform("uViewProjectionInverseMatrix", invViewProj);
glm::vec3 pos = { drawCall.thisRenderTransform[3][0], drawCall.thisRenderTransform[3][1], drawCall.thisRenderTransform[3][2] };
drawCall.material.prog->setUniform("uObjectPosition", pos);
drawCall.material.prog->setUniform("uCameraPosition", camPos);
drawCall.material.prog->setUniform("uSunDir", pass.submittedLights[0].dir);
drawCall.material.prog->setUniform("uPrevModelMatrix", static_cast<glm::mat4>(drawCall.lastRenderTransform));
drawCall.material.prog->setUniform("uPrevViewProjectionMatrix", prevViewProjectionMatrix);
drawCall.geometry.vao->render();
}
glCullFace(GL_BACK);
#endif
glEnable(GL_BLEND);
auto temp = m_primaryCompositingBuffer;
m_primaryCompositingBuffer = m_secondaryCompositingBuffer;
m_secondaryCompositingBuffer = temp;