fix: disable depth test for 2D rendering, fix glyph atlas + blend state
This commit is contained in:
1 parent
ab3181c1a5
commit
5ff05aa322
1 file changed
+48
-8
+48
-8
@@ -20,6 +20,7 @@ static ID3D11InputLayout* g_tlayout = NULL;
|
||||
static ID3D11BlendState* g_tblend = NULL;
|
||||
static ID3D11SamplerState* g_tsampler = NULL;
|
||||
static ID3D11Buffer* g_tcb = NULL;
|
||||
static ID3D11DepthStencilState* g_no_depth = NULL;
|
||||
|
||||
typedef struct { float p[3], n[3], uv[2], c[4]; } V;
|
||||
|
||||
@@ -73,12 +74,48 @@ static void on_render(Engine* engine) {
|
||||
ctx->lpVtbl->IASetPrimitiveTopology(ctx, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||
shader_bind(g_shader, ctx);
|
||||
shader_set_matrix(g_shader, ctx, (float*)&proj_t);
|
||||
|
||||
mesh_draw(g_tri, ctx);
|
||||
|
||||
ctx->lpVtbl->OMSetDepthStencilState(ctx, g_no_depth, 0);
|
||||
|
||||
draw_quad(ctx, sw - 200, 10, 180, 60, 1, 1, 1, 1);
|
||||
draw_quad(ctx, sw - 100, 20, 50, 30, 0, 1, 0, 1);
|
||||
|
||||
if (g_tvs && g_tps && g_tlayout && g_tcb && g_tblend && g_tsampler && g_atlas.srv) {
|
||||
ctx->lpVtbl->UpdateSubresource(ctx, (ID3D11Resource*)g_tcb, 0, NULL, &proj_t, 0, 0);
|
||||
ctx->lpVtbl->VSSetShader(ctx, g_tvs, NULL, 0);
|
||||
ctx->lpVtbl->PSSetShader(ctx, g_tps, NULL, 0);
|
||||
ctx->lpVtbl->IASetInputLayout(ctx, g_tlayout);
|
||||
ctx->lpVtbl->VSSetConstantBuffers(ctx, 0, 1, &g_tcb);
|
||||
ctx->lpVtbl->PSSetShaderResources(ctx, 0, 1, &g_atlas.srv);
|
||||
ctx->lpVtbl->PSSetSamplers(ctx, 0, 1, &g_tsampler);
|
||||
ctx->lpVtbl->OMSetBlendState(ctx, g_tblend, NULL, 0xFFFFFFFF);
|
||||
|
||||
typedef struct { float p[3], n[3], uv[2], c[4]; } TV;
|
||||
TV tverts[4];
|
||||
uint32_t tidx[6] = {0,1,2, 0,2,3};
|
||||
int cx = (int)(sw - 195), cy = 35;
|
||||
for (const wchar_t* p = L"\u6d4b\u8bd5"; *p; p++) {
|
||||
float u0, v0, u1, v1, adv_x, adv_y;
|
||||
if (glyph_atlas_get_or_create(&g_atlas, g_dev->device, ctx, *p, &u0, &v0, &u1, &v1, &adv_x, &adv_y)) {
|
||||
tverts[0] = (TV){{(float)cx,(float)cy,0},{0,0,1},{u0,v0},{0,0,0,1}};
|
||||
tverts[1] = (TV){{(float)cx+adv_x,(float)cy,0},{0,0,1},{u1,v0},{0,0,0,1}};
|
||||
tverts[2] = (TV){{(float)cx+adv_x,(float)cy+adv_y,0},{0,0,1},{u1,v1},{0,0,0,1}};
|
||||
tverts[3] = (TV){{(float)cx,(float)cy+adv_y,0},{0,0,1},{u0,v1},{0,0,0,1}};
|
||||
ID3D11Buffer *tvb = NULL, *tib = NULL;
|
||||
D3D11_BUFFER_DESC bd2 = {0}; D3D11_SUBRESOURCE_DATA sd2 = {0};
|
||||
bd2.ByteWidth = sizeof(TV)*4; bd2.Usage = D3D11_USAGE_DEFAULT; bd2.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
||||
sd2.pSysMem = tverts; g_dev->device->lpVtbl->CreateBuffer(g_dev->device, &bd2, &sd2, &tvb);
|
||||
bd2.ByteWidth = sizeof(uint32_t)*6; bd2.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||
sd2.pSysMem = tidx; g_dev->device->lpVtbl->CreateBuffer(g_dev->device, &bd2, &sd2, &tib);
|
||||
UINT stride2 = sizeof(TV), offset2 = 0;
|
||||
ctx->lpVtbl->IASetVertexBuffers(ctx, 0, 1, &tvb, &stride2, &offset2);
|
||||
ctx->lpVtbl->IASetIndexBuffer(ctx, tib, DXGI_FORMAT_R32_UINT, 0);
|
||||
ctx->lpVtbl->DrawIndexed(ctx, 6, 0, 0);
|
||||
tib->lpVtbl->Release(tib); tvb->lpVtbl->Release(tvb);
|
||||
cx += (int)adv_x + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (rstate) rstate->lpVtbl->Release(rstate);
|
||||
graphics_device_present(g_dev);
|
||||
@@ -113,13 +150,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||
glyph_atlas_init(&g_atlas, g_dev->device);
|
||||
|
||||
const char* tvs_src = "cbuffer CB:register(b0){float4x4 WVP;};struct VS_IN{float4 pos:POSITION;float3 n:NORMAL;float2 uv:TEXCOORD;float4 col:COLOR;};struct PS_IN{float4 pos:SV_POSITION;float2 uv:TEXCOORD;float4 col:COLOR;};PS_IN main(VS_IN i){PS_IN o;o.pos=mul(i.pos,WVP);o.uv=i.uv;o.col=i.col;return o;}";
|
||||
const char* tps_src = "struct PS_IN{float4 pos:SV_POSITION;float2 uv:TEXCOORD;float4 col:COLOR;};float4 main(PS_IN i):SV_TARGET{return i.col;}";
|
||||
const char* tps_src = "Texture2D tex:register(t0);SamplerState smp:register(s0);struct PS_IN{float4 pos:SV_POSITION;float2 uv:TEXCOORD;float4 col:COLOR;};float4 main(PS_IN i):SV_TARGET{float a=tex.Sample(smp,i.uv).a;return float4(i.col.rgb,i.col.a*a);}";
|
||||
ID3DBlob *vsb = NULL, *psb = NULL, *err = NULL;
|
||||
D3DCompile(tvs_src, (UINT)strlen(tvs_src), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &vsb, &err);
|
||||
if (err) { LOG_ERROR("Text VS error: %s", (const char*)err->lpVtbl->GetBufferPointer(err)); err->lpVtbl->Release(err); err = NULL; }
|
||||
if (err) { err->lpVtbl->Release(err); err = NULL; }
|
||||
D3DCompile(tps_src, (UINT)strlen(tps_src), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &psb, &err);
|
||||
if (err) { LOG_ERROR("Text PS error: %s", (const char*)err->lpVtbl->GetBufferPointer(err)); err->lpVtbl->Release(err); err = NULL; }
|
||||
LOG_INFO("Text shaders: vsb=%p psb=%p", (void*)vsb, (void*)psb);
|
||||
if (err) { err->lpVtbl->Release(err); err = NULL; }
|
||||
if (vsb && psb) {
|
||||
g_dev->device->lpVtbl->CreateVertexShader(g_dev->device, vsb->lpVtbl->GetBufferPointer(vsb), vsb->lpVtbl->GetBufferSize(vsb), NULL, &g_tvs);
|
||||
g_dev->device->lpVtbl->CreatePixelShader(g_dev->device, psb->lpVtbl->GetBufferPointer(psb), psb->lpVtbl->GetBufferSize(psb), NULL, &g_tps);
|
||||
@@ -145,12 +181,16 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||
bdesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
||||
bdesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
||||
bdesc.RenderTarget[0].RenderTargetWriteMask = 0x0F;
|
||||
HRESULT hr_blend = g_dev->device->lpVtbl->CreateBlendState(g_dev->device, &bdesc, &g_tblend);
|
||||
LOG_INFO("CreateBlendState hr=0x%08x blend=%p", (unsigned)hr_blend, (void*)g_tblend);
|
||||
g_dev->device->lpVtbl->CreateBlendState(g_dev->device, &bdesc, &g_tblend);
|
||||
D3D11_BUFFER_DESC cbd = {0};
|
||||
cbd.ByteWidth = 256; cbd.Usage = D3D11_USAGE_DEFAULT; cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
||||
g_dev->device->lpVtbl->CreateBuffer(g_dev->device, &cbd, NULL, &g_tcb);
|
||||
|
||||
D3D11_DEPTH_STENCIL_DESC dsdesc = {0};
|
||||
dsdesc.DepthEnable = FALSE;
|
||||
dsdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
|
||||
g_dev->device->lpVtbl->CreateDepthStencilState(g_dev->device, &dsdesc, &g_no_depth);
|
||||
|
||||
V tri[3] = {
|
||||
{{640, 300, 0}, {0,0,-1}, {0,0}, {1, 0.2f, 0.2f, 1}},
|
||||
{{500, 550, 0}, {0,0,-1}, {0,1}, {0.2f, 1, 0.2f, 1}},
|
||||
|
||||
Reference in new issue
Block a user