09.23

신승빈·2022년 9월 23일
0

KGCA 수업

목록 보기
43/128

UI

UI용 Image는 다수의 Image Set으로 가지고 있는것이 좋음
ex. Button - Mouse Hover - Click - Disable 등
Button의 경우 Click후에 Action이 발생하기를 기대하며, 이를 위해 Key_Free를 통해 판정하는 것이 좋음
Button, List, Dialog는 Composite패턴을 이용하여 구현하는 것이 좋음

UI의 종류

대화상자, List Control, Button, Combo Box, Spin Control, Slide Control 등

Alpha Blend

    D3D11_BLEND_DESC bd;
    ZeroMemory(&bd, sizeof(bd));
    // Blending 가능여부 설정
    // RenderTarget은 최대 8개까지 사용 가능
    bd.RenderTarget[0].BlendEnable = TRUE;
    // RGB값의 Blending 조건
    // Src는 Source 파일
    // Dest는 BackBuffer
    // Op는 연산 방법
    // 블렌딩 공식 : RGB = Source * Source.alpha + Dest * (1 - Source.alpha)
    bd.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
    bd.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    bd.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    //  A 성분을 혼합하는 명령
    // finalAlpha = SrcAlpha*1.0f+DestAlpha*0.0f;
    bd.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    bd.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    bd.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;

	// Blending된 RenderTarget에서 출력하고자 하는 RGBA값 Masking
    bd.RenderTarget[0].RenderTargetWriteMask =
        D3D11_COLOR_WRITE_ENABLE_ALL;
    // ID3D11BlendState g_pAlphaBlend
    // 설정된 BlendState를 나타내는 변수
    pd3dDevice->CreateBlendState(&bd, &g_pAlphaBlend);
    
    // Blend하기 위해서는 각 Source의 Pixel이 결정되야하므로, Pixel Shader가 마무리된 OutputMerger Stage에서 수행
    // Output-Merger Stage는 프로그래밍은 불가능하지만 수행 절차를 요청할수는 있음
    //DeviceContext::OMSetBlendState()

가지고있는 Texture에서 원하는 Alpha값이 없더라도 Pixel Shader나 VertexBuffer의 설정을 통해 Device에 적절한 Alpha값을 전달할 수 있다면 Texture의 Alpha값과 별개로 원하는 Blending수행 가능

    m_VertexList[0].p = { m_vNDCPos.x, m_vNDCPos.y, 0.0f };
    m_VertexList[0].t = { m_rtUV.x1, m_rtUV.y1 };
    m_VertexList[0].c = { 1,1,1,cosf(g_fGameTimer) * 0.5f+0.5f };

    m_VertexList[1].p = { m_vNDCPos.x + m_vDrawSize.x, m_vNDCPos.y,  0.0f };
    m_VertexList[1].t = { m_rtUV.x1 + m_rtUV.w, m_rtUV.y1 };
    m_VertexList[1].c = { 1,1,1,cosf(g_fGameTimer) * 0.5f + 0.5f };

    m_VertexList[2].p = { m_vNDCPos.x, m_vNDCPos.y - m_vDrawSize.y, 0.0f };
    m_VertexList[2].t = { m_rtUV.x1, m_rtUV.y1 + m_rtUV.h };
    m_VertexList[2].c = { 1,1,1,cosf(g_fGameTimer) * 0.5f + 0.5f };

    m_VertexList[3].p = { m_vNDCPos.x + m_vDrawSize.x, m_vNDCPos.y - m_vDrawSize.y, 0.0f };
    m_VertexList[3].t = { m_rtUV.x1 + m_rtUV.w , m_rtUV.y1 + m_rtUV.h };
    m_VertexList[3].c = { 1,1,1,cosf(g_fGameTimer) * 0.5f + 0.5f };

    m_pImmediateContext->UpdateSubresource(
        m_pVertexBuffer, NULL, NULL, &m_VertexList.at(0), 0, 0);    
//====================================================================================
float4 PS(VS_OUT input) : SV_Target
{
	float4 vColor = g_txTex.Sample(g_SampleWrap , input.t);
    vColor.a = 0.5f;
	return vColor*input.c;
}

Pixel Shader에 넘어가는 Texture를 다수의 Texture를 넘겨주면서 Multi Texture Blending 역시 가능

기타 사항

GetAsynKeyState

https://m.blog.naver.com/power2845/50143021565
리턴 값에 따라 Key의 입력 상태에 대한 정보를 알 수 있다고 하는데, 공식 문서의 Remark에 따르면 다른 Window에서 입력 값에 대한 정보를 가져갈 수 있으므로 이 부분에 의존하지 말라고 지적한다.

Reference : https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-getasynckeystate?redirectedfrom=MSDN#remarks
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글