Draw walls using vertex pulling

This commit is contained in:
2025-11-10 19:05:54 +00:00
parent 1546caa6a3
commit 1f01147821
8 changed files with 68 additions and 8 deletions
+19
View File
@@ -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);
}
+22
View File
@@ -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);
}
+2 -1
View File
@@ -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;
} }
-1
View File
@@ -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);
+2
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+9 -1
View File
@@ -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