Commit c7f68f6a authored by David Gilbert's avatar David Gilbert

Transform Feedback uncleaned

parent c7b8a418
#pragma import "CommonDeferredFrag.glsl"
#version 410 core
in vec3 gNormal;
in vec2 gTexCoord;
in vec3 gPosition;
in vec3 gPatchDistance;
in vec3 gTriDistance;
uniform sampler2D uTexture;
uniform vec4 uEmissiveColor;
uniform vec4 uTintColor;
uniform float uTime;
uniform mat4 uModelMatrix;
uniform mat4 uViewProjectionMatrix;
uniform mat4 uPrevModelMatrix;
uniform mat4 uPrevViewProjectionMatrix;
out vec4 oColor;
out vec4 oEmissive;
out vec3 oNormal;
out vec3 oMotion;
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
float amplify(float d, float scale, float offset){
d = scale * d + offset;
d = clamp(d, 0, 1);
......@@ -12,7 +36,7 @@ float amplify(float d, float scale, float offset){
vec4 color() {
vec4 color = texture(uTexture, teTexCoord).rgba * uTintColor;
vec4 color = texture(uTexture, gTexCoord).rgba * uTintColor;
float d1 = min(min(gTriDistance.x, gTriDistance.y), gTriDistance.z);
float d2 = min(min(gPatchDistance.x, gPatchDistance.y), gPatchDistance.z);
......@@ -26,5 +50,26 @@ vec4 emissive() {
}
vec3 normal() {
return teNormal;
return gNormal;
}
void main()
{
vec4 color = color();
float sampl = rand(gl_FragCoord.xy + vec2(mod(uTime,1)));
if(sampl > color.a) discard;
vec4 thisPosition = uViewProjectionMatrix * vec4(gPosition, 1);
vec4 prevPosition = uPrevViewProjectionMatrix * uPrevModelMatrix * inverse(uModelMatrix) * vec4(gPosition, 1);
vec3 prevFragCoord = prevPosition.xyz/prevPosition.w;
vec3 thisFragCoord = thisPosition.xyz/thisPosition.w;
oMotion = (thisFragCoord-prevFragCoord)*0.5;
oMotion.z = thisPosition.z;
oColor = color;
oEmissive = emissive();
oNormal = normalize(normal());
}
\ No newline at end of file
......@@ -3,15 +3,15 @@
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
in vec3 tPosition[3];
in vec3 tPatchDistance[3];
precise in vec3 tPosition[3];
precise in vec3 tPatchDistance[3];
in vec3 tNormal[3];
precise in vec3 tNormal[3];
in vec2 tTexCoord[3];
out vec3 teNormal;
out vec3 tePosition;
out vec2 teTexCoord;
precise out vec3 gNormal;
precise out vec3 gPosition;
precise out vec2 gTexCoord;
out vec3 gPatchDistance;
out vec3 gTriDistance;
......@@ -23,28 +23,28 @@ void main()
{
vec3 A = tPosition[2] - tPosition[0];
vec3 B = tPosition[1] - tPosition[0];
teNormal = -normalize(cross(A, B));
gNormal = -normalize(cross(A, B));
gPatchDistance = tPatchDistance[0];
//teNormal = tNormal[0];
teTexCoord = tTexCoord[0];
tePosition = tPosition[0];
//gNormal = tNormal[0];
gTexCoord = tTexCoord[0];
gPosition = tPosition[0];
gTriDistance = vec3(1, 0, 0);
gl_Position = gl_in[0].gl_Position; EmitVertex();
//teNormal = tNormal[1];
teTexCoord = tTexCoord[1];
tePosition = tPosition[1];
//gNormal = tNormal[1];
gTexCoord = tTexCoord[1];
gPosition = tPosition[1];
gPatchDistance = tPatchDistance[1];
gTriDistance = vec3(0, 1, 0);
gl_Position = gl_in[1].gl_Position; EmitVertex();
//teNormal = tNormal[2];
teTexCoord = tTexCoord[2];
tePosition = tPosition[2];
//gNormal = tNormal[2];
gTexCoord = tTexCoord[2];
gPosition = tPosition[2];
gPatchDistance = tPatchDistance[2];
gTriDistance = vec3(0, 0, 1);
......
......@@ -2,15 +2,17 @@
layout(vertices = 3) out;
in vec3 vPosition[];
in vec2 vTexCoord[];
in vec3 vNormal[];
in vec3 vLocal[];
precise in vec3 vNormal[];
precise in vec3 vPosition[];
precise in vec2 vTexCoord[];
precise out vec3 tcNormal[];
precise out vec2 tcTexCoord[];
precise out vec3 tcPosition[];
in vec3 tcPatchDistance[];
in vec3 tcTriDistance[];
uniform mat4 uViewProjectionMatrix;
uniform mat4 uModelMatrix;
......@@ -20,31 +22,31 @@ uniform vec3 cameraPosition;
float getTessLevel(float d0, float d1){
//return 1;
float avg = (d0 + d1) / 2.0;
if(avg >= 2500){
if(avg >= 500){
return 1;
}
if(avg >= 1500){
if(avg >= 400){
return 2;
}
if(avg >= 1000){
if(avg >= 300){
return 4;
}
if(avg >= 500){
if(avg >= 250){
return 8;
}
if(avg >= 200){
return 16;
}
if(avg >= 100){
if(avg >= 150){
return 32;
}
if(avg >= 50){
if(avg >= 100){
return 64;
}
else if(avg <= 0){
return 0;
if(avg >= 0){
return 64;
}
else return 1;
}
......
......@@ -6,9 +6,13 @@ precise in vec2 tcTexCoord[];
precise in vec3 tcNormal[];
precise in vec3 tcPosition[];
in vec3 tcPatchDistance[];
in vec3 tcTriDistance[];
precise out vec3 tNormal;
precise out vec2 tTexCoord;
precise out vec3 tPosition;
out vec3 tPatchDistance;
uniform mat4 uViewProjectionMatrix;
......@@ -210,9 +214,10 @@ void main(){
//vec4 camWorld = uModelMatrix * vec4(tPosition, 1.0);
tPosition += tNormal * fBM( tPosition , 8, 32, 0.007 ) ;
tPosition += tNormal * fBM( tPosition , 8, 64, 0.007) ;
tNormal = inverse(transpose(mat3(uModelMatrix))) * normalize(tNormal);
tPosition = (uModelMatrix * vec4(tPosition, 1)).xyz;
gl_Position = uViewProjectionMatrix * vec4(tPosition, 1);
......
#pragma import "CommonDeferredVert.glsl"
#version 410 core
vec3 normal() {
return aNormal;
}
precise in vec3 gNormal;
precise in vec3 gPosition;
precise in vec2 gTexCoord;
vec2 texCoord() {
return aTexCoord;
}
in vec3 gPatchDistance;
in vec3 gTriDistance;
vec3 position() {
return aPosition;
precise out vec3 vNormal;
precise out vec3 vPosition;
precise out vec2 vTexCoord;
out vec3 vPatchDistance;
out vec3 vTriDistance;
uniform mat4 uModelMatrix;
uniform mat4 uViewProjectionMatrix;
void main(){
vNormal = gNormal;
vPosition = gPosition;
vTexCoord = gTexCoord;
vPatchDistance = gPatchDistance;
vTriDistance = gTriDistance;
//gl_Position = uViewProjectionMatrix * vec4(gPosition, 1);// vec4(0, 0, 0, 1);
}
\ No newline at end of file
#version 410 core
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
precise in vec3 tPosition[3];
precise in vec3 tPatchDistance[3];
precise in vec3 tNormal[3];
precise in vec2 tTexCoord[3];
precise out vec3 gNormal;
precise out vec3 gPosition;
precise out vec2 gTexCoord;
precise out vec3 gPatchDistance;
precise out vec3 gTriDistance;
uniform mat4 uViewProjectionMatrix;
uniform mat4 uModelMatrix;
void main()
{
vec3 A = tPosition[2] - tPosition[0];
vec3 B = tPosition[1] - tPosition[0];
gNormal = -normalize(cross(A, B));
//gNormal = vec3(1.11, 1.11, 1.11);
gPatchDistance = tPatchDistance[0];
//gNormal = tNormal[0];
gTexCoord = tTexCoord[0];
gPosition = tPosition[0];
gTriDistance = vec3(1, 0, 0);
gl_Position = gl_in[0].gl_Position; EmitVertex();
//gNormal = tNormal[1];
gTexCoord = tTexCoord[1];
gPosition = tPosition[1];
gPatchDistance = tPatchDistance[1];
gTriDistance = vec3(0, 1, 0);
gl_Position = gl_in[1].gl_Position; EmitVertex();
//gNormal = tNormal[2];
gTexCoord = tTexCoord[2];
gPosition = tPosition[2];
gPatchDistance = tPatchDistance[2];
gTriDistance = vec3(0, 0, 1);
gl_Position = gl_in[2].gl_Position; EmitVertex();
EndPrimitive();
}
#version 410 core
layout(vertices = 3) out;
in vec3 vPosition[];
in vec2 vTexCoord[];
in vec3 vNormal[];
in vec3 vLocal[];
precise out vec3 tcNormal[];
precise out vec2 tcTexCoord[];
precise out vec3 tcPosition[];
uniform mat4 uViewProjectionMatrix;
uniform mat4 uModelMatrix;
uniform vec3 cameraPosition;
#define ID gl_InvocationID
float getTessLevel(float d0, float d1){
float avg = (d0 + d1) / 2.0;
if(avg >= 2500){
return 1;
}
if(avg >= 1500){
return 2;
}
if(avg >= 1000){
return 4;
}
if(avg >= 500){
return 8;
}
if(avg >= 200){
return 16;
}
if(avg >= 100){
return 32;
}
if(avg >= 50){
return 64;
}
if(avg >= 0){
return 64;
}
else return 1;
}
void main(){
tcNormal[ID] = vNormal[ID];
tcTexCoord[ID] = vTexCoord[ID];
tcPosition[ID] = vPosition[ID];
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 );
gl_TessLevelOuter[0] = getTessLevel(d1, d2);
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;
*/
}
}
#version 410 core
layout(triangles, equal_spacing, ccw) in;
precise in vec2 tcTexCoord[];
precise in vec3 tcNormal[];
precise in vec3 tcPosition[];
precise out vec3 tNormal;
precise out vec2 tTexCoord;
precise out vec3 tPosition;
out vec3 tPatchDistance;
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;
}
float fBM(vec3 p, int fOct, float freq, float weight){
float fValue = 0.0;
for(int i = 0; i <= fOct; i++){
fValue += cnoise(freq * p) * weight;
weight *= 0.5;
freq *= 2.0;
}
return fValue;
}
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(){
tNormal = interpolate3D(tcNormal[0], tcNormal[1], tcNormal[2]);
tTexCoord = interpolate2D(tcTexCoord[0], tcTexCoord[1], tcTexCoord[2]);
tPatchDistance = gl_TessCoord;
tPosition = interpolate3D(tcPosition[0], tcPosition[1], tcPosition[2]);
//vec4 camWorld = uModelMatrix * vec4(tPosition, 1.0);
//tPosition += tNormal * fBM( tPosition , 8, 32, 0.005 ) ;
tNormal = inverse(transpose(mat3(uModelMatrix))) * normalize(tNormal);
//tPosition = (uModelMatrix * vec4(tPosition, 1)).xyz;
//gl_Position = uViewProjectionMatrix * vec4(tPosition, 1);
}
#pragma import "CommonDeferredVert.glsl"
vec3 normal() {
return aNormal;
}
vec2 texCoord() {
return aTexCoord;
}
vec3 position() {
return aPosition;
}
\ No newline at end of file
......@@ -14,4 +14,5 @@ struct DrawCall {
Geometry geometry;
glm::mat4 lastRenderTransform;
glm::mat4 thisRenderTransform;
bool renderToBuffer;
};
\ No newline at end of file
......@@ -58,7 +58,17 @@ private:
ACGL::OpenGL::SharedFrameBufferObject m_primaryCompositingBuffer;
ACGL::OpenGL::SharedFrameBufferObject m_postfxTargetBuffer;
ACGL::OpenGL::SharedFrameBufferObject m_txaaHistoryBuffer;
ACGL::OpenGL::SharedVertexArrayObject m_transformFeedbackVAO;
ACGL::OpenGL::SharedArrayBuffer m_transformFeedbackBuffer;
ACGL::OpenGL::SharedVertexArrayObject m_transformFeedbackVAO2;
ACGL::OpenGL::SharedArrayBuffer m_transformFeedbackBuffer2;
GLuint Feedback;