From 7f6e7d27416dd60a8b8a17f9914dfcc8f95e326e Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 11 Nov 2025 18:54:48 +0000 Subject: [PATCH] Get shape shader working using vertex pulling Seems slow, will try to improve --- shader/shape/basic.vert | 27 ++++++++++++++++++++------- src/Dodge/Render.hs | 13 +++++++------ src/Preload/Render.hs | 12 +++++------- src/Shader/Bind.hs | 4 ---- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/shader/shape/basic.vert b/shader/shape/basic.vert index 1e8ce601f..e2caf9d54 100644 --- a/shader/shape/basic.vert +++ b/shader/shape/basic.vert @@ -1,14 +1,27 @@ #version 450 core -layout (location = 0) in vec4 pos; -layout (location = 1) in vec4 col; -layout (location = 2) in vec4 norm; +struct PosColNorm { vec4 pos; uint col; vec4 norm; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +layout (std430, binding = 3) readonly buffer Data { PosColNorm data[]; }; +layout (std430, binding = 4) readonly buffer Indices { uint indices[]; }; out vec4 vCol; out vec4 vPos; out vec4 vNorm; void main() { - gl_Position = theMat * vec4(pos.xyz,1); - vCol = col; - vPos = pos; - vNorm = norm; + vPos = data[indices[gl_VertexID]].pos; + vCol = unpackUnorm4x8(data[indices[gl_VertexID]].col); + vNorm = data[indices[gl_VertexID]].norm; + gl_Position = theMat * vec4(vPos.xyz,1); } +//layout (location = 0) in vec4 pos; +//layout (location = 1) in vec4 col; +//layout (location = 2) in vec4 norm; +//layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +//out vec4 vCol; +//out vec4 vPos; +//out vec4 vNorm; +//void main() { +// gl_Position = theMat * vec4(pos.xyz,1); +// vCol = col; +// vPos = pos; +// vNorm = norm; +//} diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index ca60cb0bb..14e0f4b34 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -176,12 +176,13 @@ doDrawing' win pdata u = do --draw object shapes onto base buffer let fs = _shapeShader pdata glUseProgram (_shaderUINT fs) - glBindVertexArray $ fs ^. shaderVAO . vaoName - glDrawElements - (_unPrimitiveMode $ _shaderPrimitive fs) - (fromIntegral nIndices) - GL_UNSIGNED_INT - nullPtr +-- glBindVertexArray $ fs ^. shaderVAO . vaoName + glDrawArrays GL_TRIANGLES 0 (fromIntegral nIndices) +-- glDrawElements +-- (_unPrimitiveMode $ _shaderPrimitive fs) +-- (fromIntegral nIndices) +-- GL_UNSIGNED_INT +-- nullPtr -- draw chasm shader blocking floor glUseProgram (pdata ^. chasmShader . shaderUINT) glBindVertexArray $ pdata ^. chasmShader . shaderVAO . vaoName diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index bc11071a0..f5e4d7745 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -82,14 +82,12 @@ preloadRender = do shEBO <- setupEBO shPosVAO -- note the shape shader vao is distinct from the position vao, but they -- share an EBO +-- shapeshader <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxAttributes +-- pmTriangles +-- shVBO +-- glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. uiboName) shapeshader <- - makeShaderUsingVBO - "shape/basic" - [vert, frag] - shapeVerxAttributes - pmTriangles - shVBO - glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. uiboName) + makeShaderUsingVAO "shape/basic" [vert, frag] pmTriangles (VAO dummyvao) putStrLn "Setup wall/windows VBO, VAO, EBO, shader" -- winvbo <- setupVBO (floatSize * 8) diff --git a/src/Shader/Bind.hs b/src/Shader/Bind.hs index db3253d56..e1211652e 100644 --- a/src/Shader/Bind.hs +++ b/src/Shader/Bind.hs @@ -29,10 +29,6 @@ bufferEBO :: UintBO -> Int -> IO () bufferEBO x i = glNamedBufferSubData (x ^. uiboName) 0 (fromIntegral $ gluintSize * i) (x ^. uiboPtr) ---bufferFloatBO :: VBO -> Int -> IO () ---bufferFloatBO x i = undefined --- glNamedBufferSubData (x ^. uiboName) 0 (fromIntegral $ gluintSize * i) (x ^. uiboPtr) - bufferShaderLayers :: MV.MVector (PrimState IO) (Shader, VBO) -> UMV.MVector (PrimState IO) Int -> IO () bufferShaderLayers shads counts = MV.imapM_ f shads where