Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1252:01e9f41d35b1
add:support for push constants
| author | sam <sam@basx.dev> |
|---|---|
| date | Fri, 26 Jul 2024 23:04:01 +0700 |
| parents | e8b3dc80e48e |
| children | 4cf9872f7bb6 |
comparison
equal
deleted
inserted
replaced
| 1251:3f98ad20a9d3 | 1252:01e9f41d35b1 |
|---|---|
| 9 | 9 |
| 10 proc test_01_triangle(time: float32) = | 10 proc test_01_triangle(time: float32) = |
| 11 var renderdata = InitRenderData() | 11 var renderdata = InitRenderData() |
| 12 | 12 |
| 13 type | 13 type |
| 14 PushConstant = object | |
| 15 scale: float32 | |
| 14 Shader = object | 16 Shader = object |
| 15 position {.VertexAttribute.}: Vec3f | 17 position {.VertexAttribute.}: Vec3f |
| 16 color {.VertexAttribute.}: Vec3f | 18 color {.VertexAttribute.}: Vec3f |
| 19 pushConstant {.PushConstantAttribute.}: PushConstant | |
| 17 fragmentColor {.Pass.}: Vec3f | 20 fragmentColor {.Pass.}: Vec3f |
| 18 outColor {.ShaderOutput.}: Vec4f | 21 outColor {.ShaderOutput.}: Vec4f |
| 19 # code | 22 # code |
| 20 vertexCode: string = """void main() { | 23 vertexCode: string = """void main() { |
| 21 fragmentColor = color; | 24 fragmentColor = color; |
| 22 gl_Position = vec4(position, 1);}""" | 25 gl_Position = vec4(position * pushConstant.scale, 1);}""" |
| 23 fragmentCode: string = """void main() { | 26 fragmentCode: string = """void main() { |
| 24 outColor = vec4(fragmentColor, 1);}""" | 27 outColor = vec4(fragmentColor, 1);}""" |
| 25 TriangleMesh = object | 28 TriangleMesh = object |
| 26 position: GPUArray[Vec3f, VertexBuffer] | 29 position: GPUArray[Vec3f, VertexBuffer] |
| 27 color: GPUArray[Vec3f, VertexBuffer] | 30 color: GPUArray[Vec3f, VertexBuffer] |
| 41 | 44 |
| 42 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 45 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 43 | 46 |
| 44 WithPipeline(commandbuffer, pipeline): | 47 WithPipeline(commandbuffer, pipeline): |
| 45 | 48 |
| 46 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 49 RenderWithPushConstant(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh, pushConstant = PushConstant(scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000))) |
| 47 | 50 |
| 48 # cleanup | 51 # cleanup |
| 49 checkVkResult vkDeviceWaitIdle(vulkan.device) | 52 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 50 DestroyPipeline(pipeline) | 53 DestroyPipeline(pipeline) |
| 51 DestroyRenderData(renderdata) | 54 DestroyRenderData(renderdata) |
| 131 Material = object | 134 Material = object |
| 132 baseColor: Vec3f | 135 baseColor: Vec3f |
| 133 | 136 |
| 134 Uniforms = object | 137 Uniforms = object |
| 135 material: GPUValue[Material, UniformBuffer] | 138 material: GPUValue[Material, UniformBuffer] |
| 136 texture1: Image[RGBA] | 139 texture1: Image[BGRA] |
| 137 | 140 |
| 138 QuadShader = object | 141 QuadShader = object |
| 139 position {.VertexAttribute.}: Vec3f | 142 position {.VertexAttribute.}: Vec3f |
| 140 fragmentColor {.Pass.}: Vec3f | 143 fragmentColor {.Pass.}: Vec3f |
| 141 uv {.Pass.}: Vec2f | 144 uv {.Pass.}: Vec2f |
| 152 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" | 155 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" |
| 153 QuadMesh = object | 156 QuadMesh = object |
| 154 position: GPUArray[Vec3f, VertexBuffer] | 157 position: GPUArray[Vec3f, VertexBuffer] |
| 155 indices: GPUArray[uint16, IndexBuffer] | 158 indices: GPUArray[uint16, IndexBuffer] |
| 156 | 159 |
| 157 let R = RGBA([255'u8, 0'u8, 0'u8, 255'u8]) | 160 let R = BGRA([255'u8, 0'u8, 0'u8, 255'u8]) |
| 158 let G = RGBA([0'u8, 255'u8, 0'u8, 255'u8]) | 161 let G = BGRA([0'u8, 255'u8, 0'u8, 255'u8]) |
| 159 let B = RGBA([0'u8, 0'u8, 255'u8, 255'u8]) | 162 let B = BGRA([0'u8, 0'u8, 255'u8, 255'u8]) |
| 160 let W = RGBA([255'u8, 255'u8, 255'u8, 255'u8]) | 163 let W = BGRA([255'u8, 255'u8, 255'u8, 255'u8]) |
| 161 var | 164 var |
| 162 quad = QuadMesh( | 165 quad = QuadMesh( |
| 163 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), | 166 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), |
| 164 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 167 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
| 165 ) | 168 ) |
| 166 uniforms1 = asDescriptorSet( | 169 uniforms1 = asDescriptorSet( |
| 167 Uniforms( | 170 Uniforms( |
| 168 material: asGPUValue(Material(baseColor: NewVec3f(1, 1, 1)), UniformBuffer), | 171 material: asGPUValue(Material(baseColor: NewVec3f(1, 1, 1)), UniformBuffer), |
| 169 texture1: Image[RGBA](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], interpolation: VK_FILTER_NEAREST), | 172 texture1: Image[BGRA](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), |
| 170 ) | 173 ) |
| 171 ) | 174 ) |
| 172 uniforms2 = asDescriptorSet( | 175 uniforms2 = asDescriptorSet( |
| 173 Uniforms( | 176 Uniforms( |
| 174 material: asGPUValue(Material(baseColor: NewVec3f(0.5, 0.5, 0.5)), UniformBuffer), | 177 material: asGPUValue(Material(baseColor: NewVec3f(0.5, 0.5, 0.5)), UniformBuffer), |
| 175 texture1: Image[RGBA](width: 2, height: 2, data: @[R, G, B, W]), | 178 texture1: Image[BGRA](width: 2, height: 2, data: @[R, G, B, W]), |
| 176 ) | 179 ) |
| 177 ) | 180 ) |
| 178 | 181 |
| 179 AssignBuffers(renderdata, quad) | 182 AssignBuffers(renderdata, quad) |
| 180 AssignBuffers(renderdata, uniforms1) | 183 AssignBuffers(renderdata, uniforms1) |
| 269 material: [ | 272 material: [ |
| 270 asGPUValue(Material(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), | 273 asGPUValue(Material(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), |
| 271 asGPUValue(Material(baseColor: NewVec3f(1, 0, 1)), UniformBuffer), | 274 asGPUValue(Material(baseColor: NewVec3f(1, 0, 1)), UniformBuffer), |
| 272 ], | 275 ], |
| 273 texture1: [ | 276 texture1: [ |
| 274 Image[Gray](width: 2, height: 2, data: @[W, G, G, W], interpolation: VK_FILTER_NEAREST), | 277 Image[Gray](width: 2, height: 2, data: @[W, G, G, W], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), |
| 275 Image[Gray](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], interpolation: VK_FILTER_NEAREST), | 278 Image[Gray](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), |
| 276 ], | 279 ], |
| 277 ), | 280 ), |
| 278 ) | 281 ) |
| 279 var otherset1 = asDescriptorSet( | 282 var otherset1 = asDescriptorSet( |
| 280 OtherSet( | 283 OtherSet( |
| 520 proc test_07_png_texture(time: float32) = | 523 proc test_07_png_texture(time: float32) = |
| 521 var renderdata = InitRenderData() | 524 var renderdata = InitRenderData() |
| 522 | 525 |
| 523 type | 526 type |
| 524 Uniforms = object | 527 Uniforms = object |
| 525 texture1: Image[RGBA] | 528 texture1: Image[BGRA] |
| 526 Shader = object | 529 Shader = object |
| 527 position {.VertexAttribute.}: Vec3f | 530 position {.VertexAttribute.}: Vec3f |
| 528 uv {.VertexAttribute.}: Vec2f | 531 uv {.VertexAttribute.}: Vec2f |
| 529 fragmentUv {.Pass.}: Vec2f | 532 fragmentUv {.Pass.}: Vec2f |
| 530 outColor {.ShaderOutput.}: Vec4f | 533 outColor {.ShaderOutput.}: Vec4f |
| 556 renderdata.FlushAllMemory() | 559 renderdata.FlushAllMemory() |
| 557 | 560 |
| 558 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass) | 561 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass) |
| 559 var uniforms1 = asDescriptorSet( | 562 var uniforms1 = asDescriptorSet( |
| 560 Uniforms( | 563 Uniforms( |
| 561 texture1: LoadImage[RGBA]("art.png"), | 564 texture1: LoadImage[BGRA]("art.png"), |
| 562 ) | 565 ) |
| 563 ) | 566 ) |
| 564 UploadImages(renderdata, uniforms1) | 567 UploadImages(renderdata, uniforms1) |
| 565 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 568 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 566 | 569 |
| 588 | 591 |
| 589 var renderdata = InitRenderData() | 592 var renderdata = InitRenderData() |
| 590 | 593 |
| 591 type | 594 type |
| 592 Uniforms = object | 595 Uniforms = object |
| 593 frameTexture: Image[RGBA] | 596 frameTexture: Image[BGRA] |
| 594 TriangleShader = object | 597 TriangleShader = object |
| 595 position {.VertexAttribute.}: Vec3f | 598 position {.VertexAttribute.}: Vec3f |
| 596 color {.VertexAttribute.}: Vec3f | 599 color {.VertexAttribute.}: Vec3f |
| 597 fragmentColor {.Pass.}: Vec3f | 600 fragmentColor {.Pass.}: Vec3f |
| 598 outColor {.ShaderOutput.}: Vec4f | 601 outColor {.ShaderOutput.}: Vec4f |
| 637 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer), | 640 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer), |
| 638 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 641 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
| 639 ) | 642 ) |
| 640 var uniforms1 = asDescriptorSet( | 643 var uniforms1 = asDescriptorSet( |
| 641 Uniforms( | 644 Uniforms( |
| 642 frameTexture: Image[RGBA](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true), | 645 frameTexture: Image[BGRA](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true), |
| 643 ) | 646 ) |
| 644 ) | 647 ) |
| 645 AssignBuffers(renderdata, mesh) | 648 AssignBuffers(renderdata, mesh) |
| 646 AssignBuffers(renderdata, quad) | 649 AssignBuffers(renderdata, quad) |
| 647 UploadImages(renderdata, uniforms1) | 650 UploadImages(renderdata, uniforms1) |
