ba6fd00b54
Preparacion del pipeline GPU. Codigo nuevo aislado en
core/rendering/gpu/; el runtime sigue usando SDL_Renderer hasta
Fase 7b. Tras 7a el juego sigue funcionando identico.
Shaders (shaders/):
- line.vert.glsl: vertex shader, transforma de pixeles logicos a NDC
via uniform buffer LineUniforms{viewport_w, viewport_h}.
- line.frag.glsl: pinta el color RGBA interpolado.
Build:
- CMakeLists.txt: step nuevo que compila *.glsl a build/shaders/*.spv
con glslc. ALL depende del target 'shaders' para incluirlo en cada
build. Falla en cmake config si glslc no esta instalado.
Wrappers C++ (source/core/rendering/gpu/):
- gpu_device.hpp/cpp: GpuDevice, claim del window, loadShader desde
.spv. Backends solicitados: Vulkan + Metal (sin DirectX).
- gpu_line_pipeline.hpp/cpp: GpuLinePipeline. Vertex layout
(vec2 pos + vec4 color), primitive TRIANGLELIST (lineas como
quads), alpha blending estandar, sin culling ni depth.
- gpu_frame_renderer.hpp/cpp: GpuFrameRenderer, API alto nivel:
beginFrame / pushLine / endFrame. Extrusion perpendicular en CPU
por linea (thickness libre por linea). Un draw call por frame
con vertex+index buffers transitorios.
Plan: 7b swap del SDL_Renderer al GpuFrameRenderer en SDLManager.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
30 lines
1.1 KiB
GLSL
30 lines
1.1 KiB
GLSL
#version 450
|
|
|
|
// Vertex shader para líneas vectoriales.
|
|
// Las líneas se proveen ya extrudidas en CPU como quads (2 triángulos por línea)
|
|
// con grosor configurable. El vertex shader solo:
|
|
// 1. Transforma de píxeles lógicos (0..viewport_size) a clip-space (-1..+1).
|
|
// 2. Pasa el color RGBA al fragment shader.
|
|
//
|
|
// Slot de uniform buffer 0 (vertex): viewport size para la transformación.
|
|
// Convención SDL_gpu: SDL_PushGPUVertexUniformData(cmd, 0, &ubo, sizeof(ubo)).
|
|
|
|
layout(set = 1, binding = 0) uniform UBO {
|
|
vec2 viewport_size; // ancho y alto en píxeles lógicos (ej. 1280, 720)
|
|
vec2 _padding; // alineamiento a 16 bytes
|
|
} ubo;
|
|
|
|
layout(location = 0) in vec2 in_position; // píxeles lógicos
|
|
layout(location = 1) in vec4 in_color; // RGBA 0..1
|
|
|
|
layout(location = 0) out vec4 frag_color;
|
|
|
|
void main() {
|
|
// Píxeles lógicos -> NDC (-1..+1)
|
|
vec2 ndc = (in_position / ubo.viewport_size) * 2.0 - 1.0;
|
|
// Y flip: SDL screen-Y va hacia abajo, clip-Y hacia arriba.
|
|
ndc.y = -ndc.y;
|
|
gl_Position = vec4(ndc, 0.0, 1.0);
|
|
frag_color = in_color;
|
|
}
|