rename basic shader to character
add character shadow make animation play twice as fast when sprinting
This commit is contained in:
+2
-1
@@ -105,7 +105,8 @@ function(add_shader name)
|
|||||||
set(SHADERS_WGSL ${SHADERS_WGSL} "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/wgsl/${name}.wgsl" PARENT_SCOPE)
|
set(SHADERS_WGSL ${SHADERS_WGSL} "${CMAKE_CURRENT_SOURCE_DIR}/src/shaders/wgsl/${name}.wgsl" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
add_shader(basic)
|
add_shader(character)
|
||||||
|
add_shader(character_shadow)
|
||||||
add_shader(world)
|
add_shader(world)
|
||||||
add_shader(grid)
|
add_shader(grid)
|
||||||
|
|
||||||
|
|||||||
+24
-3
@@ -36,6 +36,7 @@ static SDL_Window *window;
|
|||||||
static R_Texture framebuffer;
|
static R_Texture framebuffer;
|
||||||
|
|
||||||
static R_Texture player_texture;
|
static R_Texture player_texture;
|
||||||
|
static R_Texture character_shadow_texture;
|
||||||
static R_Texture tile_textures_atlas;
|
static R_Texture tile_textures_atlas;
|
||||||
static R_Texture tile_textures_atlas_imgui;
|
static R_Texture tile_textures_atlas_imgui;
|
||||||
|
|
||||||
@@ -915,6 +916,12 @@ static bool init_resources() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
character_shadow_texture = create_texture("characters/shadow.png");
|
||||||
|
if (!character_shadow_texture) {
|
||||||
|
log_error("Failed to create shader texture.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!recreate_tile_textures()) {
|
if (!recreate_tile_textures()) {
|
||||||
log_error("Failed to create tile textures.");
|
log_error("Failed to create tile textures.");
|
||||||
return false;
|
return false;
|
||||||
@@ -1438,7 +1445,7 @@ static void update_state_game() {
|
|||||||
const bool *keyboard_state = SDL_GetKeyboardState(NULL);
|
const bool *keyboard_state = SDL_GetKeyboardState(NULL);
|
||||||
|
|
||||||
if (player.is_moving) {
|
if (player.is_moving) {
|
||||||
player.animation_time += delta_time;
|
player.animation_time += delta_time * (keyboard_state[SDL_SCANCODE_LSHIFT] ? 2 : 1);
|
||||||
|
|
||||||
vec2 leftover_movement = vec2(player.target_position) - player.visual_position;
|
vec2 leftover_movement = vec2(player.target_position) - player.visual_position;
|
||||||
vec2 movement = clamp(min(vec2(0, 0), leftover_movement), normalize(leftover_movement) * (delta_t * character_speed * (keyboard_state[SDL_SCANCODE_LSHIFT] ? 2.0f : 1.0f)), max(vec2(0, 0), leftover_movement));
|
vec2 movement = clamp(min(vec2(0, 0), leftover_movement), normalize(leftover_movement) * (delta_t * character_speed * (keyboard_state[SDL_SCANCODE_LSHIFT] ? 2.0f : 1.0f)), max(vec2(0, 0), leftover_movement));
|
||||||
@@ -1478,7 +1485,8 @@ static void render_game() {
|
|||||||
{
|
{
|
||||||
ZoneScopedN("player_instance_buffer");
|
ZoneScopedN("player_instance_buffer");
|
||||||
|
|
||||||
Uint64 variation_index = (player.animation_time / (100 * SDL_NS_PER_MS)) % 4;
|
Uint64 ns_per_variation = (1.0f / (character_speed * 2)) * SDL_NS_PER_SECOND;
|
||||||
|
Uint64 variation_index = (player.animation_time / (ns_per_variation)) % 4;
|
||||||
|
|
||||||
player_instance.pos = player.visual_position;
|
player_instance.pos = player.visual_position;
|
||||||
player_instance.sprite_selection = variation_index << 16 | player.direction;
|
player_instance.sprite_selection = variation_index << 16 | player.direction;
|
||||||
@@ -1555,7 +1563,20 @@ static void render_game() {
|
|||||||
|
|
||||||
{
|
{
|
||||||
ZoneScopedN("Draw Player");
|
ZoneScopedN("Draw Player");
|
||||||
renderer_frame_set_shader(R_SHADER_BASIC);
|
renderer_frame_set_shader(R_SHADER_CHARACTER_SHADOW);
|
||||||
|
renderer_frame_draw(vertex_buffer, index_buffer, player_instance_buffer, 6, 1, &(R_Draw_Resources){
|
||||||
|
.vertex_uniform_buffers = (R_Buffer[]){ view_projection_matrix_buffer },
|
||||||
|
|
||||||
|
.num_vertex_uniform_buffers = 1,
|
||||||
|
|
||||||
|
.fragment_sampled_textures = (R_Texture[]){ character_shadow_texture },
|
||||||
|
.fragment_uniform_buffers = (R_Buffer[]){ tint_color_buffer },
|
||||||
|
|
||||||
|
.num_fragment_sampled_textures = 1,
|
||||||
|
.num_fragment_uniform_buffers = 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
renderer_frame_set_shader(R_SHADER_CHARACTER);
|
||||||
renderer_frame_draw(vertex_buffer, index_buffer, player_instance_buffer, 6, 1, &(R_Draw_Resources){
|
renderer_frame_draw(vertex_buffer, index_buffer, player_instance_buffer, 6, 1, &(R_Draw_Resources){
|
||||||
.vertex_uniform_buffers = (R_Buffer[]){ view_projection_matrix_buffer },
|
.vertex_uniform_buffers = (R_Buffer[]){ view_projection_matrix_buffer },
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -8,7 +8,8 @@ extern "C" {
|
|||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
typedef enum : Uint32 {
|
typedef enum : Uint32 {
|
||||||
R_SHADER_BASIC,
|
R_SHADER_CHARACTER,
|
||||||
|
R_SHADER_CHARACTER_SHADOW,
|
||||||
R_SHADER_WORLD,
|
R_SHADER_WORLD,
|
||||||
R_SHADER_GRID,
|
R_SHADER_GRID,
|
||||||
R_SHADER_COUNT,
|
R_SHADER_COUNT,
|
||||||
|
|||||||
+160
-3
@@ -409,9 +409,9 @@ bool renderer_init(SDL_Window *window_) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Shaders
|
// Shaders
|
||||||
{ // Basic
|
{ // Character
|
||||||
const Uint8 shader_source[] = {
|
const Uint8 shader_source[] = {
|
||||||
#embed "shaders/spirv/basic.spv"
|
#embed "shaders/spirv/character.spv"
|
||||||
};
|
};
|
||||||
|
|
||||||
SDL_GPUShader *vertex_shader = SDL_CreateGPUShader(device, &(SDL_GPUShaderCreateInfo){
|
SDL_GPUShader *vertex_shader = SDL_CreateGPUShader(device, &(SDL_GPUShaderCreateInfo){
|
||||||
@@ -445,7 +445,164 @@ bool renderer_init(SDL_Window *window_) {
|
|||||||
SDL_PropertiesID properties = SDL_CreateProperties();
|
SDL_PropertiesID properties = SDL_CreateProperties();
|
||||||
SDL_SetStringProperty(properties, SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING, "R_SHADER basic");
|
SDL_SetStringProperty(properties, SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING, "R_SHADER basic");
|
||||||
|
|
||||||
shaders[R_SHADER_BASIC] = SDL_CreateGPUGraphicsPipeline(device, &(SDL_GPUGraphicsPipelineCreateInfo){
|
shaders[R_SHADER_CHARACTER] = SDL_CreateGPUGraphicsPipeline(device, &(SDL_GPUGraphicsPipelineCreateInfo){
|
||||||
|
.vertex_shader = vertex_shader,
|
||||||
|
.fragment_shader = fragment_shader,
|
||||||
|
|
||||||
|
.vertex_input_state = {
|
||||||
|
.vertex_buffer_descriptions = (SDL_GPUVertexBufferDescription[]){
|
||||||
|
{
|
||||||
|
.slot = 0,
|
||||||
|
.pitch = 20,
|
||||||
|
.input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX,
|
||||||
|
|
||||||
|
.instance_step_rate = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.slot = 1,
|
||||||
|
.pitch = 12,
|
||||||
|
.input_rate = SDL_GPU_VERTEXINPUTRATE_INSTANCE,
|
||||||
|
|
||||||
|
.instance_step_rate = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.num_vertex_buffers = 2,
|
||||||
|
|
||||||
|
.vertex_attributes = (SDL_GPUVertexAttribute[]){
|
||||||
|
{
|
||||||
|
.location = 0,
|
||||||
|
.buffer_slot = 0,
|
||||||
|
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3,
|
||||||
|
.offset = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.location = 1,
|
||||||
|
.buffer_slot = 0,
|
||||||
|
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||||
|
.offset = 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.location = 2,
|
||||||
|
.buffer_slot = 1,
|
||||||
|
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||||
|
.offset = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.location = 3,
|
||||||
|
.buffer_slot = 1,
|
||||||
|
.format = SDL_GPU_VERTEXELEMENTFORMAT_UINT,
|
||||||
|
.offset = 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.num_vertex_attributes = 4,
|
||||||
|
},
|
||||||
|
|
||||||
|
.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||||
|
|
||||||
|
.rasterizer_state = {
|
||||||
|
.fill_mode = SDL_GPU_FILLMODE_FILL,
|
||||||
|
.cull_mode = SDL_GPU_CULLMODE_BACK,
|
||||||
|
.front_face = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
|
||||||
|
|
||||||
|
.depth_bias_constant_factor = 0.0f,
|
||||||
|
.depth_bias_clamp = 0.0f,
|
||||||
|
.depth_bias_slope_factor = 0.0f,
|
||||||
|
|
||||||
|
.enable_depth_bias = false,
|
||||||
|
.enable_depth_clip = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.multisample_state = {
|
||||||
|
.sample_count = SDL_GPU_SAMPLECOUNT_8,
|
||||||
|
.sample_mask = 0,
|
||||||
|
.enable_mask = 0,
|
||||||
|
|
||||||
|
.enable_alpha_to_coverage = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.depth_stencil_state = {
|
||||||
|
.compare_op = SDL_GPU_COMPAREOP_GREATER_OR_EQUAL,
|
||||||
|
|
||||||
|
.back_stencil_state = { .fail_op = SDL_GPU_STENCILOP_INVALID, .pass_op = SDL_GPU_STENCILOP_INVALID, .depth_fail_op = SDL_GPU_STENCILOP_INVALID, .compare_op = SDL_GPU_COMPAREOP_INVALID, },
|
||||||
|
.front_stencil_state = { .fail_op = SDL_GPU_STENCILOP_INVALID, .pass_op = SDL_GPU_STENCILOP_INVALID, .depth_fail_op = SDL_GPU_STENCILOP_INVALID, .compare_op = SDL_GPU_COMPAREOP_INVALID, },
|
||||||
|
|
||||||
|
.compare_mask = 0,
|
||||||
|
.write_mask = 0,
|
||||||
|
|
||||||
|
.enable_depth_test = false,
|
||||||
|
.enable_depth_write = false,
|
||||||
|
.enable_stencil_test = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.target_info = {
|
||||||
|
.color_target_descriptions = (SDL_GPUColorTargetDescription[]){
|
||||||
|
{
|
||||||
|
.format = texture_formats[surface.format],
|
||||||
|
.blend_state = {
|
||||||
|
.src_color_blendfactor = SDL_GPU_BLENDFACTOR_SRC_ALPHA,
|
||||||
|
.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
|
||||||
|
.color_blend_op = SDL_GPU_BLENDOP_ADD,
|
||||||
|
|
||||||
|
.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_SRC_ALPHA,
|
||||||
|
.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
|
||||||
|
.alpha_blend_op = SDL_GPU_BLENDOP_ADD,
|
||||||
|
|
||||||
|
.color_write_mask = 0,
|
||||||
|
|
||||||
|
.enable_blend = true,
|
||||||
|
.enable_color_write_mask = false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
.num_color_targets = 1,
|
||||||
|
|
||||||
|
.depth_stencil_format = SDL_GPU_TEXTUREFORMAT_INVALID,
|
||||||
|
.has_depth_stencil_target = false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
SDL_DestroyProperties(properties);
|
||||||
|
SDL_ReleaseGPUShader(device, vertex_shader);
|
||||||
|
SDL_ReleaseGPUShader(device, fragment_shader);
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // Character Shadow
|
||||||
|
const Uint8 shader_source[] = {
|
||||||
|
#embed "shaders/spirv/character_shadow.spv"
|
||||||
|
};
|
||||||
|
|
||||||
|
SDL_GPUShader *vertex_shader = SDL_CreateGPUShader(device, &(SDL_GPUShaderCreateInfo){
|
||||||
|
.code_size = sizeof(shader_source),
|
||||||
|
.code = shader_source,
|
||||||
|
.entrypoint = "main_vertex",
|
||||||
|
|
||||||
|
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||||
|
.stage = SDL_GPU_SHADERSTAGE_VERTEX,
|
||||||
|
|
||||||
|
.num_samplers = 0,
|
||||||
|
.num_storage_textures = 0,
|
||||||
|
.num_storage_buffers = 0,
|
||||||
|
.num_uniform_buffers = 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
SDL_GPUShader *fragment_shader = SDL_CreateGPUShader(device, &(SDL_GPUShaderCreateInfo){
|
||||||
|
.code_size = sizeof(shader_source),
|
||||||
|
.code = shader_source,
|
||||||
|
.entrypoint = "main_fragment",
|
||||||
|
|
||||||
|
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||||
|
.stage = SDL_GPU_SHADERSTAGE_FRAGMENT,
|
||||||
|
|
||||||
|
.num_samplers = 1,
|
||||||
|
.num_storage_textures = 0,
|
||||||
|
.num_storage_buffers = 0,
|
||||||
|
.num_uniform_buffers = 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
SDL_PropertiesID properties = SDL_CreateProperties();
|
||||||
|
SDL_SetStringProperty(properties, SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING, "R_SHADER basic");
|
||||||
|
|
||||||
|
shaders[R_SHADER_CHARACTER_SHADOW] = SDL_CreateGPUGraphicsPipeline(device, &(SDL_GPUGraphicsPipelineCreateInfo){
|
||||||
.vertex_shader = vertex_shader,
|
.vertex_shader = vertex_shader,
|
||||||
.fragment_shader = fragment_shader,
|
.fragment_shader = fragment_shader,
|
||||||
|
|
||||||
|
|||||||
+124
-3
@@ -673,9 +673,9 @@ bool renderer_init(SDL_Window *window_) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Shaders
|
// Shaders
|
||||||
{ // Basic
|
{ // Character
|
||||||
const char shader_source[] = {
|
const char shader_source[] = {
|
||||||
#embed "shaders/wgsl/basic.wgsl"
|
#embed "shaders/wgsl/character.wgsl"
|
||||||
};
|
};
|
||||||
|
|
||||||
WGPUShaderModule shader = wgpuDeviceCreateShaderModule(device, &(WGPUShaderModuleDescriptor){
|
WGPUShaderModule shader = wgpuDeviceCreateShaderModule(device, &(WGPUShaderModuleDescriptor){
|
||||||
@@ -686,7 +686,128 @@ bool renderer_init(SDL_Window *window_) {
|
|||||||
.label = { .data = "basic shader", .length = WGPU_STRLEN }
|
.label = { .data = "basic shader", .length = WGPU_STRLEN }
|
||||||
});
|
});
|
||||||
|
|
||||||
shaders[R_SHADER_BASIC] = wgpuDeviceCreateRenderPipeline(device, &(WGPURenderPipelineDescriptor){
|
shaders[R_SHADER_CHARACTER] = wgpuDeviceCreateRenderPipeline(device, &(WGPURenderPipelineDescriptor){
|
||||||
|
.label = { .data = "basic render_pipeline", .length = WGPU_STRLEN },
|
||||||
|
|
||||||
|
.layout = wgpuDeviceCreatePipelineLayout(device, &(WGPUPipelineLayoutDescriptor){
|
||||||
|
.label = { .data = "basic pipeline_layout", .length = WGPU_STRLEN },
|
||||||
|
.bindGroupLayoutCount = 4,
|
||||||
|
.bindGroupLayouts = (WGPUBindGroupLayout[]){
|
||||||
|
wgpuDeviceCreateBindGroupLayout(device, &(WGPUBindGroupLayoutDescriptor){
|
||||||
|
.entryCount = 0,
|
||||||
|
.entries = (WGPUBindGroupLayoutEntry[]){
|
||||||
|
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
wgpuDeviceCreateBindGroupLayout(device, &(WGPUBindGroupLayoutDescriptor){
|
||||||
|
.entryCount = 1,
|
||||||
|
.entries = (WGPUBindGroupLayoutEntry[]){
|
||||||
|
{ .binding = 0, .visibility = WGPUShaderStage_Vertex, .buffer = { .type = WGPUBufferBindingType_Uniform } },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
wgpuDeviceCreateBindGroupLayout(device, &(WGPUBindGroupLayoutDescriptor){
|
||||||
|
.entryCount = 2,
|
||||||
|
.entries = (WGPUBindGroupLayoutEntry[]){
|
||||||
|
{ .binding = 0, .visibility = WGPUShaderStage_Fragment, .texture = { .sampleType = WGPUTextureSampleType_Float, .viewDimension = WGPUTextureViewDimension_2D } },
|
||||||
|
{ .binding = 1, .visibility = WGPUShaderStage_Fragment, .sampler = { .type = WGPUSamplerBindingType_Filtering } },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
wgpuDeviceCreateBindGroupLayout(device, &(WGPUBindGroupLayoutDescriptor){
|
||||||
|
.entryCount = 1,
|
||||||
|
.entries = (WGPUBindGroupLayoutEntry[]){
|
||||||
|
{ .binding = 0, .visibility = WGPUShaderStage_Fragment, .buffer = { .type = WGPUBufferBindingType_Uniform } },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
.vertex = {
|
||||||
|
.module = shader,
|
||||||
|
.entryPoint = { .data = "main_vertex", .length = WGPU_STRLEN },
|
||||||
|
.constantCount = 0,
|
||||||
|
.constants = NULL,
|
||||||
|
.bufferCount = 2,
|
||||||
|
.buffers = (WGPUVertexBufferLayout[]){
|
||||||
|
{
|
||||||
|
.stepMode = WGPUVertexStepMode_Vertex,
|
||||||
|
.arrayStride = 20,
|
||||||
|
.attributeCount = 2,
|
||||||
|
.attributes = (WGPUVertexAttribute[]){
|
||||||
|
{
|
||||||
|
.format = WGPUVertexFormat_Float32x3,
|
||||||
|
.offset = 0,
|
||||||
|
.shaderLocation = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.format = WGPUVertexFormat_Float32x2,
|
||||||
|
.offset = 12,
|
||||||
|
.shaderLocation = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.stepMode = WGPUVertexStepMode_Instance,
|
||||||
|
.arrayStride = 12,
|
||||||
|
.attributeCount = 2,
|
||||||
|
.attributes = (WGPUVertexAttribute[]){
|
||||||
|
{
|
||||||
|
.format = WGPUVertexFormat_Float32x2,
|
||||||
|
.offset = 0,
|
||||||
|
.shaderLocation = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.format = WGPUVertexFormat_Uint32,
|
||||||
|
.offset = 8,
|
||||||
|
.shaderLocation = 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
.primitive = {
|
||||||
|
.topology = WGPUPrimitiveTopology_TriangleList,
|
||||||
|
.stripIndexFormat = WGPUIndexFormat_Undefined,
|
||||||
|
.frontFace = WGPUFrontFace_CCW,
|
||||||
|
.cullMode = WGPUCullMode_Back,
|
||||||
|
.unclippedDepth = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.depthStencil = NULL,
|
||||||
|
|
||||||
|
.multisample = {
|
||||||
|
.count = 4,
|
||||||
|
.mask = ~0u,
|
||||||
|
.alphaToCoverageEnabled = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.fragment = &(WGPUFragmentState){
|
||||||
|
.module = shader,
|
||||||
|
.entryPoint = { .data = "main_fragment", .length = WGPU_STRLEN },
|
||||||
|
.constantCount = 0,
|
||||||
|
.constants = NULL,
|
||||||
|
.targetCount = 1,
|
||||||
|
.targets = &color_target_state,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
wgpuShaderModuleRelease(shader);
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // Character Shadow
|
||||||
|
const char shader_source[] = {
|
||||||
|
#embed "shaders/wgsl/character_shadow.wgsl"
|
||||||
|
};
|
||||||
|
|
||||||
|
WGPUShaderModule shader = wgpuDeviceCreateShaderModule(device, &(WGPUShaderModuleDescriptor){
|
||||||
|
.nextInChain = (WGPUChainedStruct *)&(WGPUShaderSourceWGSL){
|
||||||
|
.chain = { .next = NULL, .sType = WGPUSType_ShaderSourceWGSL },
|
||||||
|
.code = { .data = shader_source, .length = SDL_arraysize(shader_source) },
|
||||||
|
},
|
||||||
|
.label = { .data = "basic shader", .length = WGPU_STRLEN }
|
||||||
|
});
|
||||||
|
|
||||||
|
shaders[R_SHADER_CHARACTER_SHADOW] = wgpuDeviceCreateRenderPipeline(device, &(WGPURenderPipelineDescriptor){
|
||||||
.label = { .data = "basic render_pipeline", .length = WGPU_STRLEN },
|
.label = { .data = "basic render_pipeline", .length = WGPU_STRLEN },
|
||||||
|
|
||||||
.layout = wgpuDeviceCreatePipelineLayout(device, &(WGPUPipelineLayoutDescriptor){
|
.layout = wgpuDeviceCreatePipelineLayout(device, &(WGPUPipelineLayoutDescriptor){
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,75 @@
|
|||||||
|
#language 2026
|
||||||
|
|
||||||
|
#include "shared.slang"
|
||||||
|
|
||||||
|
struct VertexShaderInput {
|
||||||
|
uint32_t vertex_index : SV_VulkanVertexID;
|
||||||
|
|
||||||
|
[vk::location(0)] float3 pos;
|
||||||
|
[vk::location(1)] float2 uv;
|
||||||
|
|
||||||
|
// Per Instance
|
||||||
|
[vk::location(2)] float2 world_pos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexShaderOutput {
|
||||||
|
float4 pos : SV_Position;
|
||||||
|
|
||||||
|
float2 uv;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FragmentShaderOutput {
|
||||||
|
float4 color : SV_Target;
|
||||||
|
};
|
||||||
|
|
||||||
|
[shader("vertex")]
|
||||||
|
VertexShaderOutput main_vertex(VertexShaderInput input) {
|
||||||
|
var output: VertexShaderOutput;
|
||||||
|
|
||||||
|
input.pos.xy *= 0.5;
|
||||||
|
|
||||||
|
output.pos = mul(float4(input.world_pos + input.pos.xy, 0, 1), view_projection_matrix);
|
||||||
|
output.uv = input.uv;
|
||||||
|
|
||||||
|
// uint sprite_x = bitfieldExtract(input.sprite_selection, 16, 16);
|
||||||
|
// uint sprite_y = bitfieldExtract(input.sprite_selection, 0, 16);
|
||||||
|
|
||||||
|
// output.uv = (float2(sprite_x, sprite_y) + input.uv) * (1.0 / 4.0);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
[vk::binding(0, 2)] Sampler2D<float4> texture1 : register(t0, space2);
|
||||||
|
|
||||||
|
[vk::binding(0, 3)] ConstantBuffer<float3> tint : register(b0, space3);
|
||||||
|
|
||||||
|
[shader("pixel")]
|
||||||
|
FragmentShaderOutput main_fragment(VertexShaderOutput input) {
|
||||||
|
var output: FragmentShaderOutput;
|
||||||
|
|
||||||
|
output.color = pixel_art_sample(texture1, input.uv);
|
||||||
|
output.color = float4(output.color.rgb * tint.rgb, output.color.a);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetDimensions(Sampler2D<float4> texture, out float width, out float height) {
|
||||||
|
__target_switch {
|
||||||
|
case wgsl: {
|
||||||
|
texture.__getTexture().GetDimensions(width, height);
|
||||||
|
} break;
|
||||||
|
default: {
|
||||||
|
texture.GetDimensions(width, height);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 pixel_art_sample(Sampler2D<float4> input_texture, float2 input_uv) {
|
||||||
|
var dimensions : float2;
|
||||||
|
GetDimensions(input_texture, dimensions.x, dimensions.y);
|
||||||
|
|
||||||
|
let texture_uv = input_uv * dimensions.xy;
|
||||||
|
let sample_uv = (floor(texture_uv) + min(fract(texture_uv) / fwidth(texture_uv), float2(1.0, 1.0)) - 0.5) / dimensions.xy;
|
||||||
|
|
||||||
|
return input_texture.Sample(sample_uv);
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
struct _MatrixStorage_float4x4_ColMajorstd140_0
|
||||||
|
{
|
||||||
|
@align(16) data_0 : array<vec4<f32>, i32(4)>,
|
||||||
|
};
|
||||||
|
|
||||||
|
@binding(0) @group(1) var<uniform> view_projection_matrix_0 : _MatrixStorage_float4x4_ColMajorstd140_0;
|
||||||
|
@binding(0) @group(2) var texture1_texture_0 : texture_2d<f32>;
|
||||||
|
|
||||||
|
@binding(1) @group(2) var texture1_sampler_0 : sampler;
|
||||||
|
|
||||||
|
@binding(0) @group(3) var<uniform> tint_0 : vec3<f32>;
|
||||||
|
struct VertexShaderOutput_0
|
||||||
|
{
|
||||||
|
@builtin(position) pos_0 : vec4<f32>,
|
||||||
|
@location(0) uv_0 : vec2<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct vertexInput_0
|
||||||
|
{
|
||||||
|
@location(0) pos_1 : vec3<f32>,
|
||||||
|
@location(1) uv_1 : vec2<f32>,
|
||||||
|
@location(2) world_pos_0 : vec2<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexShaderInput_0
|
||||||
|
{
|
||||||
|
vertex_index_0 : u32,
|
||||||
|
pos_2 : vec3<f32>,
|
||||||
|
uv_2 : vec2<f32>,
|
||||||
|
world_pos_1 : vec2<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main_vertex( _S1 : vertexInput_0, @builtin(vertex_index) vertex_index_1 : u32) -> VertexShaderOutput_0
|
||||||
|
{
|
||||||
|
var _S2 : VertexShaderInput_0;
|
||||||
|
_S2.vertex_index_0 = vertex_index_1;
|
||||||
|
_S2.pos_2 = _S1.pos_1;
|
||||||
|
_S2.uv_2 = _S1.uv_1;
|
||||||
|
_S2.world_pos_1 = _S1.world_pos_0;
|
||||||
|
var _S3 : vec2<f32> = _S2.pos_2.xy * vec2<f32>(0.5f);
|
||||||
|
_S2.pos_2.x = _S3.x;
|
||||||
|
_S2.pos_2.y = _S3.y;
|
||||||
|
var output_0 : VertexShaderOutput_0;
|
||||||
|
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(_S2.world_pos_1 + _S2.pos_2.xy, 0.0f, 1.0f))));
|
||||||
|
output_0.uv_0 = _S2.uv_2;
|
||||||
|
return output_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn GetDimensions_0( texture_texture_0 : texture_2d<f32>, texture_sampler_0 : sampler, width_0 : ptr<function, f32>, height_0 : ptr<function, f32>)
|
||||||
|
{
|
||||||
|
{var dim = textureDimensions((texture_texture_0));(((*width_0))) = f32(dim.x);(((*height_0))) = f32(dim.y);};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pixel_art_sample_0( input_texture_texture_0 : texture_2d<f32>, input_texture_sampler_0 : sampler, input_uv_0 : vec2<f32>) -> vec4<f32>
|
||||||
|
{
|
||||||
|
var dimensions_0 : vec2<f32>;
|
||||||
|
var _S4 : f32 = dimensions_0[i32(0)];
|
||||||
|
var _S5 : f32 = dimensions_0[i32(1)];
|
||||||
|
GetDimensions_0(input_texture_texture_0, input_texture_sampler_0, &(_S4), &(_S5));
|
||||||
|
dimensions_0[i32(0)] = _S4;
|
||||||
|
dimensions_0[i32(1)] = _S5;
|
||||||
|
var _S6 : vec2<f32> = input_uv_0 * dimensions_0.xy;
|
||||||
|
var _S7 : vec2<f32> = (floor(_S6) + min(fract(_S6) / (fwidth((_S6))), vec2<f32>(1.0f, 1.0f)) - vec2<f32>(0.5f)) / dimensions_0.xy;
|
||||||
|
;
|
||||||
|
return (textureSample((input_texture_texture_0), (input_texture_sampler_0), (_S7)));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FragmentShaderOutput_0
|
||||||
|
{
|
||||||
|
@location(0) color_0 : vec4<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pixelInput_0
|
||||||
|
{
|
||||||
|
@location(0) uv_3 : vec2<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
@fragment
|
||||||
|
fn main_fragment( _S8 : pixelInput_0, @builtin(position) pos_3 : vec4<f32>) -> FragmentShaderOutput_0
|
||||||
|
{
|
||||||
|
var output_1 : FragmentShaderOutput_0;
|
||||||
|
var _S9 : vec4<f32> = pixel_art_sample_0(texture1_texture_0, texture1_sampler_0, _S8.uv_3);
|
||||||
|
output_1.color_0 = vec4<f32>(_S9.xyz * tint_0.xyz, _S9.w);
|
||||||
|
return output_1;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user