Draw walls using vertex pulling
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
#version 450 core
|
||||||
|
layout (location=0) out vec4 fCol;
|
||||||
|
layout (location=1) out vec4 fPos;
|
||||||
|
layout (location=2) out vec4 fNorm;
|
||||||
|
in vec3 vTexCoords;
|
||||||
|
in vec4 vPos;
|
||||||
|
in float vAng;
|
||||||
|
layout (binding=40) uniform sampler2DArray diffuseSampler;
|
||||||
|
layout (binding=41) uniform sampler2DArray normalSampler;
|
||||||
|
vec2 rotateV2 (float a, vec2 v)
|
||||||
|
{ return vec2(v.x*cos(a) - v.y*sin(a), v.x*sin(a) + v.y*cos(a)); }
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fCol = texture(diffuseSampler,vTexCoords);
|
||||||
|
fPos = vPos;
|
||||||
|
vec4 basenorm = texture(normalSampler,vTexCoords) - 0.5;
|
||||||
|
vec2 n1 = rotateV2(vAng,vec2(basenorm.x,basenorm.z));
|
||||||
|
fNorm = vec4(-vec3(n1,basenorm.y),0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#version 450 core
|
||||||
|
struct PosTex { vec4 pospos; vec4 texang; };
|
||||||
|
layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ;
|
||||||
|
layout (std430, binding = 2) readonly buffer Pos { PosTex data[]; };
|
||||||
|
out float vAng;
|
||||||
|
out vec4 vPos;
|
||||||
|
out vec3 vTexCoords;
|
||||||
|
int indices[6] = {0,1,3,0,3,2};
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 texang = data[gl_VertexID / 6].texang;
|
||||||
|
vec4 pp = data[gl_VertexID / 6].pospos;
|
||||||
|
int j = indices[gl_VertexID % 6];
|
||||||
|
float z = (j > 1.5 ? 100 : 0);
|
||||||
|
vec2 xy = (j % 2 > 0 ? pp.xy : pp.zw);
|
||||||
|
vPos = vec4( xy, z, 1);
|
||||||
|
gl_Position = theMat * vPos;
|
||||||
|
vAng = texang.y;
|
||||||
|
float d = distance(pp.xy,pp.zw) / 50;
|
||||||
|
int jj = j / 2;
|
||||||
|
vTexCoords = vec3(d * (j % 2), 2 * jj , texang.x);
|
||||||
|
}
|
||||||
@@ -12,5 +12,6 @@ void main()
|
|||||||
int j = indices[gl_VertexID % 6];
|
int j = indices[gl_VertexID % 6];
|
||||||
float z = (j > 1.5 ? 5000 : 0);
|
float z = (j > 1.5 ? 5000 : 0);
|
||||||
vec2 xy = (j % 2 > 0 ? pp.xy : pp.zw);
|
vec2 xy = (j % 2 > 0 ? pp.xy : pp.zw);
|
||||||
gl_Position = theMat * vec4( xy, z, 1);
|
vPos = vec4( xy, z, 1);
|
||||||
|
gl_Position = theMat * vPos;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ void main()
|
|||||||
vec2 d = vec2(p1.xy - p2.xy);
|
vec2 d = vec2(p1.xy - p2.xy);
|
||||||
float dist = distance(p1xy,p2xy);
|
float dist = distance(p1xy,p2xy);
|
||||||
float tcoordx = dist / 50;
|
float tcoordx = dist / 50;
|
||||||
vec4 norm = vec4( d.y, -d.x, 0, 0);
|
|
||||||
gPos = p1;
|
gPos = p1;
|
||||||
gl_Position = vec4(theMat * p1);
|
gl_Position = vec4(theMat * p1);
|
||||||
gTexCoords = vec3 (0,0,tcoordz);
|
gTexCoords = vec3 (0,0,tcoordz);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ data RenderData = RenderData
|
|||||||
, _alphaDivideShader :: Shader
|
, _alphaDivideShader :: Shader
|
||||||
-- , _windowShader :: Shader
|
-- , _windowShader :: Shader
|
||||||
, _windowPullShader :: Shader
|
, _windowPullShader :: Shader
|
||||||
|
, _pullWallShader :: Shader
|
||||||
, _fullscreenShader :: Shader
|
, _fullscreenShader :: Shader
|
||||||
, _transparencyCompShader :: Shader
|
, _transparencyCompShader :: Shader
|
||||||
, _bloomBlurShader :: Shader
|
, _bloomBlurShader :: Shader
|
||||||
@@ -42,6 +43,7 @@ data RenderData = RenderData
|
|||||||
, _rboBaseBloom :: GLuint -- RenderbufferObject id
|
, _rboBaseBloom :: GLuint -- RenderbufferObject id
|
||||||
, _matUBO :: GLuint -- BufferObject id
|
, _matUBO :: GLuint -- BufferObject id
|
||||||
, _winSSBO :: GLuint
|
, _winSSBO :: GLuint
|
||||||
|
, _wallSSBO :: GLuint
|
||||||
-- , _lightsUBO :: GLuint -- BufferObject id
|
-- , _lightsUBO :: GLuint -- BufferObject id
|
||||||
, _vboWindows :: VBO
|
, _vboWindows :: VBO
|
||||||
, _vboShapes :: VBO
|
, _vboShapes :: VBO
|
||||||
|
|||||||
+13
-4
@@ -113,6 +113,9 @@ doDrawing' win pdata u = do
|
|||||||
glNamedBufferSubData (pdata ^. winSSBO) 0
|
glNamedBufferSubData (pdata ^. winSSBO) 0
|
||||||
(fromIntegral $ nWins * sizeOf (0::Float) * 8)
|
(fromIntegral $ nWins * sizeOf (0::Float) * 8)
|
||||||
(pdata ^. vboWindows . vboPtr)
|
(pdata ^. vboWindows . vboPtr)
|
||||||
|
glNamedBufferSubData (pdata ^. wallSSBO) 0
|
||||||
|
(fromIntegral $ trueNWalls * sizeOf (0::Float) * 8)
|
||||||
|
(pdata ^. wallVBO . vboPtr)
|
||||||
setViewport _gr_world_res cfig
|
setViewport _gr_world_res cfig
|
||||||
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO)
|
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO)
|
||||||
glDepthMask GL_TRUE
|
glDepthMask GL_TRUE
|
||||||
@@ -162,12 +165,18 @@ doDrawing' win pdata u = do
|
|||||||
--draw walls onto base buffer
|
--draw walls onto base buffer
|
||||||
glEnable GL_CULL_FACE
|
glEnable GL_CULL_FACE
|
||||||
glCullFace GL_BACK
|
glCullFace GL_BACK
|
||||||
glUseProgram (pdata ^. wallShader . shaderUINT)
|
-- glUseProgram (pdata ^. wallShader . shaderUINT)
|
||||||
glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName
|
-- glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName
|
||||||
|
-- glDrawArrays
|
||||||
|
-- (_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive)
|
||||||
|
-- 0
|
||||||
|
-- (fromIntegral trueNWalls)
|
||||||
|
glUseProgram (pdata ^. pullWallShader . shaderUINT)
|
||||||
|
glBindVertexArray $ pdata ^. dummyVAO . vaoName
|
||||||
glDrawArrays
|
glDrawArrays
|
||||||
(_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive)
|
GL_TRIANGLES
|
||||||
0
|
0
|
||||||
(fromIntegral trueNWalls)
|
(fromIntegral trueNWalls * 6)
|
||||||
--draw object shapes onto base buffer
|
--draw object shapes onto base buffer
|
||||||
let fs = _shapeShader pdata
|
let fs = _shapeShader pdata
|
||||||
glUseProgram (_shaderUINT fs)
|
glUseProgram (_shaderUINT fs)
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import Data.Foldable
|
|||||||
import Data.Monoid
|
import Data.Monoid
|
||||||
|
|
||||||
testStringInit :: Universe -> [String]
|
testStringInit :: Universe -> [String]
|
||||||
testStringInit _ = []
|
testStringInit u = [show $ length $ u ^. uvWorld . cWorld . lWorld . walls]
|
||||||
-- [show $ foldMap (foldMap (Sum . length . (^. seObstacles)))
|
-- [show $ foldMap (foldMap (Sum . length . (^. seObstacles)))
|
||||||
-- $ u ^. uvWorld . cWorld . incGraph]
|
-- $ u ^. uvWorld . cWorld . incGraph]
|
||||||
-- foldMap prettyShort $ u ^? uvWorld . cWorld . lWorld . machines . ix 0 . mcType . _McProxSensor
|
-- foldMap prettyShort $ u ^? uvWorld . cWorld . lWorld . machines . ix 0 . mcType . _McProxSensor
|
||||||
|
|||||||
@@ -41,14 +41,20 @@ preloadRender = do
|
|||||||
|
|
||||||
winssbo <- mglCreate glCreateBuffers
|
winssbo <- mglCreate glCreateBuffers
|
||||||
let winssbosize = sizeOf (0::Float) * 8 * 1024
|
let winssbosize = sizeOf (0::Float) * 8 * 1024
|
||||||
|
|
||||||
glNamedBufferStorage winssbo (fromIntegral winssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT
|
glNamedBufferStorage winssbo (fromIntegral winssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT
|
||||||
glBindBufferBase GL_SHADER_STORAGE_BUFFER 1 winssbo
|
glBindBufferBase GL_SHADER_STORAGE_BUFFER 1 winssbo
|
||||||
|
|
||||||
|
wallssbo <- mglCreate glCreateBuffers
|
||||||
|
let wallssbosize = sizeOf (0::Float) * 8 * 2048
|
||||||
|
glNamedBufferStorage wallssbo (fromIntegral wallssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT
|
||||||
|
glBindBufferBase GL_SHADER_STORAGE_BUFFER 2 wallssbo
|
||||||
|
|
||||||
dummyvao <- mglCreate glGenVertexArrays
|
dummyvao <- mglCreate glGenVertexArrays
|
||||||
|
|
||||||
winpull <- makeShaderUsingVAO "pull/window" [vert,frag] pmTriangles (VAO dummyvao)
|
winpull <- makeShaderUsingVAO "pull/window" [vert,frag] pmTriangles (VAO dummyvao)
|
||||||
|
|
||||||
|
wallpull <- makeShaderUsingVAO "pull/wall" [vert,frag] pmTriangles (VAO dummyvao)
|
||||||
|
|
||||||
-- setup shape geometry/cap VBO and two VAOs
|
-- setup shape geometry/cap VBO and two VAOs
|
||||||
putStrLn "Setup shape VBO, VAO, EBO"
|
putStrLn "Setup shape VBO, VAO, EBO"
|
||||||
shVBO <- setupVBO shapeVerxSize
|
shVBO <- setupVBO shapeVerxSize
|
||||||
@@ -182,6 +188,7 @@ preloadRender = do
|
|||||||
, _ceilingStencilShader = ceilingstencilshader
|
, _ceilingStencilShader = ceilingstencilshader
|
||||||
-- , _windowShader = windowshader
|
-- , _windowShader = windowshader
|
||||||
, _windowPullShader = winpull
|
, _windowPullShader = winpull
|
||||||
|
, _pullWallShader = wallpull
|
||||||
, _fullscreenShader = fsShad
|
, _fullscreenShader = fsShad
|
||||||
, _transparencyCompShader = transcompshader
|
, _transparencyCompShader = transcompshader
|
||||||
, _alphaDivideShader = alphadivideshader
|
, _alphaDivideShader = alphadivideshader
|
||||||
@@ -203,6 +210,7 @@ preloadRender = do
|
|||||||
, _rboBaseBloom = rboBaseBloomName
|
, _rboBaseBloom = rboBaseBloomName
|
||||||
, _matUBO = theUBO
|
, _matUBO = theUBO
|
||||||
, _winSSBO = winssbo
|
, _winSSBO = winssbo
|
||||||
|
, _wallSSBO = wallssbo
|
||||||
-- , _lightsUBO = lightsubo
|
-- , _lightsUBO = lightsubo
|
||||||
, _vboWindows = winvbo
|
, _vboWindows = winvbo
|
||||||
, _vboShapes = shVBO
|
, _vboShapes = shVBO
|
||||||
|
|||||||
Reference in New Issue
Block a user