Skip to content

Commit bae91cd

Browse files
mmozeikoryanfleury
authored andcommitted
doing blur shader without alpha blending
1 parent 82f86d6 commit bae91cd

File tree

4 files changed

+35
-31
lines changed

4 files changed

+35
-31
lines changed

src/render/d3d11/generated/render_d3d11.meta.h

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ str8_lit_comp(
227227
" float4 position : SV_POSITION;\n"
228228
" float2 texcoord : TEX;\n"
229229
" float2 sdf_sample_pos : SDF;\n"
230+
" nointerpolation float2 rect_half_size : RHS;\n"
230231
" float corner_radius : RAD;\n"
231232
"};\n"
232233
"\n"
@@ -271,6 +272,7 @@ str8_lit_comp(
271272
" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n"
272273
" v2p.texcoord = vertex_position__pct;\n"
273274
" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n"
275+
" v2p.rect_half_size = rect_half_size - 2.f;\n"
274276
" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n"
275277
" }\n"
276278
" return v2p;\n"
@@ -282,33 +284,28 @@ str8_lit_comp(
282284
"ps_main(Vertex2Pixel v2p) : SV_TARGET\n"
283285
"{\n"
284286
" // rjf: blend weighted texture samples into color\n"
285-
" float4 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord);\n"
286-
" color.a = kernel[0].x;\n"
287+
" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n"
287288
" \n"
288289
" for(uint i = 1; i < blur_count; i += 1)\n"
289290
" {\n"
290291
" float weight = kernel[i].x;\n"
291292
" float offset = kernel[i].y;\n"
292-
" float4 min_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction);\n"
293-
" float4 max_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction);\n"
294-
" min_sample.a = 1.f;\n"
295-
" max_sample.a = 1.f;\n"
296-
" color += min_sample * weight;\n"
297-
" color += max_sample * weight;\n"
293+
" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n"
294+
" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n"
298295
" }\n"
299296
" \n"
300-
" // rjf: determine SDF sample position\n"
301-
" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n"
302-
" float2 sdf_sample_pos = v2p.sdf_sample_pos;\n"
303-
" \n"
304297
" // rjf: sample for corners\n"
305-
" float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size - 2.f, v2p.corner_radius);\n"
298+
" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n"
306299
" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n"
307300
" \n"
308301
" // rjf: weight output color by sdf\n"
309-
" color.a *= corner_sdf_t;\n"
302+
" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n"
303+
" if (corner_sdf_t < 0.9f)\n"
304+
" {\n"
305+
" discard;\n"
306+
" }\n"
310307
" \n"
311-
" return color;\n"
308+
" return float4(color, 1.f);\n"
312309
"}\n"
313310
""
314311
);

src/render/d3d11/render_d3d11.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,15 @@ r_init(CmdLine *cmdln)
232232
error = r_d3d11_state->device->CreateBlendState(&desc, &r_d3d11_state->main_blend_state);
233233
}
234234

235+
{
236+
D3D11_BLEND_DESC desc = {0};
237+
{
238+
desc.RenderTarget[0].BlendEnable = FALSE;
239+
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
240+
}
241+
error = r_d3d11_state->device->CreateBlendState(&desc, &r_d3d11_state->no_blend_state);
242+
}
243+
235244
//- rjf: create nearest-neighbor sampler
236245
{
237246
D3D11_SAMPLER_DESC desc = zero_struct;
@@ -1190,7 +1199,7 @@ r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)
11901199

11911200
// rjf: setup output merger
11921201
d_ctx->OMSetDepthStencilState(r_d3d11_state->noop_depth_stencil, 0);
1193-
d_ctx->OMSetBlendState(r_d3d11_state->main_blend_state, 0, 0xffffffff);
1202+
d_ctx->OMSetBlendState(r_d3d11_state->no_blend_state, 0, 0xffffffff);
11941203

11951204
// rjf: set up viewport
11961205
Vec2S32 resolution = wnd->last_resolution;

src/render/d3d11/render_d3d11.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ struct R_D3D11_State
134134
IDXGIFactory2 *dxgi_factory;
135135
ID3D11RasterizerState1 *main_rasterizer;
136136
ID3D11BlendState *main_blend_state;
137+
ID3D11BlendState *no_blend_state;
137138
ID3D11SamplerState *samplers[R_Tex2DSampleKind_COUNT];
138139
ID3D11DepthStencilState *noop_depth_stencil;
139140
ID3D11DepthStencilState *plain_depth_stencil;

src/render/d3d11/render_d3d11.mdesk

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ struct Vertex2Pixel
226226
float4 position : SV_POSITION;
227227
float2 texcoord : TEX;
228228
float2 sdf_sample_pos : SDF;
229+
nointerpolation float2 rect_half_size : RHS;
229230
float corner_radius : RAD;
230231
};
231232

@@ -270,6 +271,7 @@ vs_main(CPU2Vertex c2v)
270271
v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);
271272
v2p.texcoord = vertex_position__pct;
272273
v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;
274+
v2p.rect_half_size = rect_half_size - 2.f;
273275
v2p.corner_radius = corner_radii__px[c2v.vertex_id];
274276
}
275277
return v2p;
@@ -281,33 +283,28 @@ float4
281283
ps_main(Vertex2Pixel v2p) : SV_TARGET
282284
{
283285
// rjf: blend weighted texture samples into color
284-
float4 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord);
285-
color.a = kernel[0].x;
286+
float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;
286287

287288
for(uint i = 1; i < blur_count; i += 1)
288289
{
289290
float weight = kernel[i].x;
290291
float offset = kernel[i].y;
291-
float4 min_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction);
292-
float4 max_sample = stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction);
293-
min_sample.a = 1.f;
294-
max_sample.a = 1.f;
295-
color += min_sample * weight;
296-
color += max_sample * weight;
292+
color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;
293+
color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;
297294
}
298295

299-
// rjf: determine SDF sample position
300-
float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);
301-
float2 sdf_sample_pos = v2p.sdf_sample_pos;
302-
303296
// rjf: sample for corners
304-
float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size - 2.f, v2p.corner_radius);
297+
float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);
305298
float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);
306299

307300
// rjf: weight output color by sdf
308-
color.a *= corner_sdf_t;
301+
// this is doing alpha testing, leave blurring only where mostly opaque pixels are
302+
if (corner_sdf_t < 0.9f)
303+
{
304+
discard;
305+
}
309306

310-
return color;
307+
return float4(color, 1.f);
311308
}
312309
"""
313310

0 commit comments

Comments
 (0)