https://minusi.tistory.com/entry/XMVECTOR와-XMFLOAT
XMVECTOR와 XMFLOAT
DirectX12 외에도 일반적인 선형 대수 및 DirectX 응용 프로그램에 공통적인 그래픽 수한 연산을 위한 SIMD(single instruction multiple data) 친화적인 C++ 형식(type) 및 함수를 제공합니다. 이 라이브러리는 W..
minusi.tistory.com
XMVECTOR 타입은 DirectXMath에서 사용되는 핵심 벡터 타입입니다. XMVECTOR는 SIMD 하드웨어 레지스터에 대응되는데, 즉 128비트(단일정밀도 부동소수점 4개, 32 * 4비트) 크기의 타입을 SIMD 명령 하나로 네 값을 한 번에 처리할 수 있습니다.
x64 플랫폼 및 SSE2가 활성화된 x86 플랫폼에서 이 타입은 다음과 같이 정의됩니다:
typedef __m128 XMVECTOR;
__m128이 바로 SIMD 타입으로써, 벡터 계산시 이 타입이어야만 SIMD의 장점을 발휘할 수 있습니다. 단일정밀도 4개로 구성된 값이므로 4차원 벡터를 표현할 수 있지만, 나머지 요소들을 0으로 채워넣음으로써 2차원 및 3차원 벡터에서도 사용할 수 있습니다.
// Gets the world transformation matrix
XMMATRIX CSprite::GetWorldMatrix()
{
XMMATRIX translation = XMMatrixTranslation(m_position.x, m_position.y, 0.0f );
XMMATRIX rotationZ = XMMatrixRotationZ(m_rotation);
XMMATRIX scale = XMMatrixScaling(m_scale.x, m_scale.y, 1.0f);
return translation * rotationZ * scale;
}
void CDemoSprites::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Stride and offset
UINT stride = sizeof(Vertex);
UINT offset = 0;
// Set vertex buffer
m_pD3DContext->IASetInputLayout(m_pInputLayout);
m_pD3DContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset);
m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Set shaders
m_pD3DContext->VSSetShader(m_pVS, 0, 0);
m_pD3DContext->PSSetShader(m_pPS, 0, 0);
m_pD3DContext->PSSetShaderResources(0, 1, &m_pColorMap);
m_pD3DContext->PSSetSamplers(0, 1, &m_pColorMapSampler);
// Draw sprites
for (int i = 0; i < 2; i++)
{
XMMATRIX world = m_Sprites[i].GetWorldMatrix( );
XMMATRIX mvp = XMMatrixMultiply(world, m_vpMatrix);
mvp = XMMatrixTranspose(mvp);
m_pD3DContext->UpdateSubresource( m_MvpCB, 0, 0, &mvp, 0, 0 );
m_pD3DContext->VSSetConstantBuffers( 0, 1, &m_MvpCB );
m_pD3DContext->Draw(6, 0);
}
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
https://copynull.tistory.com/260
[DirectX11] Tutorial 11 - 2D 렌더링
Tutorial 11 - 2D 렌더링 원문 : http://www.rastertek.com/dx11tut11.html 화면에 2D 이미지를 그리는 것은 정말 유용합니다. 예를 들어 대부분의 유저 인터페이스(UI), 스프라이트 시스템, 텍스트 엔진들은 2D..
copynull.tistory.com
// Create world matrix buffer
D3D11_BUFFER_DESC constDesc;
::ZeroMemory(&constDesc, sizeof(constDesc));
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constDesc.ByteWidth = sizeof(XMMATRIX);
constDesc.Usage = D3D11_USAGE_DEFAULT;
hr = m_pD3DDevice->CreateBuffer(&constDesc, 0, &m_MvpCB);
if (FAILED(hr)) {
return false;
}
// Position and scale sprites
m_Sprites[0].SetPosition(XMFLOAT2(400.0f, 600.0f));
m_Sprites[1].SetPosition(XMFLOAT2(1200.0f, 600.0f));
m_Sprites[0].SetScale(XMFLOAT2(0.5, 0.5));
m_Sprites[1].SetScale(XMFLOAT2(0.5, 0.5));
// Make world matrix
XMMATRIX view = XMMatrixIdentity();
//왼손 좌표계에 대한 사용자 지정 직교 투영 행렬을 만든다
XMMATRIX projection = XMMatrixOrthographicOffCenterLH(
0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
m_vpMatrix = XMMatrixMultiply(view, projection);
// Set blend description
//투명도 설정을 위해 블렌딩을 사용
//투명한 텍스쳐를 사용하게 해준다
D3D11_BLEND_DESC blendDesc;
::ZeroMemory(&blendDesc, sizeof(blendDesc));
blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].RenderTargetWriteMask = 0x0F;
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };

'기타 > directX' 카테고리의 다른 글
[DirectX11] 삼각형 그리기 (0) | 2022.02.26 |
---|---|
[DirectX11] 렌더링 (0) | 2022.02.26 |
[DirectX11] 텍스쳐 그리기 (0) | 2022.02.22 |
https://minusi.tistory.com/entry/XMVECTOR와-XMFLOAT
XMVECTOR와 XMFLOAT
DirectX12 외에도 일반적인 선형 대수 및 DirectX 응용 프로그램에 공통적인 그래픽 수한 연산을 위한 SIMD(single instruction multiple data) 친화적인 C++ 형식(type) 및 함수를 제공합니다. 이 라이브러리는 W..
minusi.tistory.com
XMVECTOR 타입은 DirectXMath에서 사용되는 핵심 벡터 타입입니다. XMVECTOR는 SIMD 하드웨어 레지스터에 대응되는데, 즉 128비트(단일정밀도 부동소수점 4개, 32 * 4비트) 크기의 타입을 SIMD 명령 하나로 네 값을 한 번에 처리할 수 있습니다.
x64 플랫폼 및 SSE2가 활성화된 x86 플랫폼에서 이 타입은 다음과 같이 정의됩니다:
typedef __m128 XMVECTOR;
__m128이 바로 SIMD 타입으로써, 벡터 계산시 이 타입이어야만 SIMD의 장점을 발휘할 수 있습니다. 단일정밀도 4개로 구성된 값이므로 4차원 벡터를 표현할 수 있지만, 나머지 요소들을 0으로 채워넣음으로써 2차원 및 3차원 벡터에서도 사용할 수 있습니다.
// Gets the world transformation matrix
XMMATRIX CSprite::GetWorldMatrix()
{
XMMATRIX translation = XMMatrixTranslation(m_position.x, m_position.y, 0.0f );
XMMATRIX rotationZ = XMMatrixRotationZ(m_rotation);
XMMATRIX scale = XMMatrixScaling(m_scale.x, m_scale.y, 1.0f);
return translation * rotationZ * scale;
}
void CDemoSprites::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Stride and offset
UINT stride = sizeof(Vertex);
UINT offset = 0;
// Set vertex buffer
m_pD3DContext->IASetInputLayout(m_pInputLayout);
m_pD3DContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset);
m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Set shaders
m_pD3DContext->VSSetShader(m_pVS, 0, 0);
m_pD3DContext->PSSetShader(m_pPS, 0, 0);
m_pD3DContext->PSSetShaderResources(0, 1, &m_pColorMap);
m_pD3DContext->PSSetSamplers(0, 1, &m_pColorMapSampler);
// Draw sprites
for (int i = 0; i < 2; i++)
{
XMMATRIX world = m_Sprites[i].GetWorldMatrix( );
XMMATRIX mvp = XMMatrixMultiply(world, m_vpMatrix);
mvp = XMMatrixTranspose(mvp);
m_pD3DContext->UpdateSubresource( m_MvpCB, 0, 0, &mvp, 0, 0 );
m_pD3DContext->VSSetConstantBuffers( 0, 1, &m_MvpCB );
m_pD3DContext->Draw(6, 0);
}
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
https://copynull.tistory.com/260
[DirectX11] Tutorial 11 - 2D 렌더링
Tutorial 11 - 2D 렌더링 원문 : http://www.rastertek.com/dx11tut11.html 화면에 2D 이미지를 그리는 것은 정말 유용합니다. 예를 들어 대부분의 유저 인터페이스(UI), 스프라이트 시스템, 텍스트 엔진들은 2D..
copynull.tistory.com
// Create world matrix buffer
D3D11_BUFFER_DESC constDesc;
::ZeroMemory(&constDesc, sizeof(constDesc));
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constDesc.ByteWidth = sizeof(XMMATRIX);
constDesc.Usage = D3D11_USAGE_DEFAULT;
hr = m_pD3DDevice->CreateBuffer(&constDesc, 0, &m_MvpCB);
if (FAILED(hr)) {
return false;
}
// Position and scale sprites
m_Sprites[0].SetPosition(XMFLOAT2(400.0f, 600.0f));
m_Sprites[1].SetPosition(XMFLOAT2(1200.0f, 600.0f));
m_Sprites[0].SetScale(XMFLOAT2(0.5, 0.5));
m_Sprites[1].SetScale(XMFLOAT2(0.5, 0.5));
// Make world matrix
XMMATRIX view = XMMatrixIdentity();
//왼손 좌표계에 대한 사용자 지정 직교 투영 행렬을 만든다
XMMATRIX projection = XMMatrixOrthographicOffCenterLH(
0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
m_vpMatrix = XMMatrixMultiply(view, projection);
// Set blend description
//투명도 설정을 위해 블렌딩을 사용
//투명한 텍스쳐를 사용하게 해준다
D3D11_BLEND_DESC blendDesc;
::ZeroMemory(&blendDesc, sizeof(blendDesc));
blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].RenderTargetWriteMask = 0x0F;
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };

'기타 > directX' 카테고리의 다른 글
[DirectX11] 삼각형 그리기 (0) | 2022.02.26 |
---|---|
[DirectX11] 렌더링 (0) | 2022.02.26 |
[DirectX11] 텍스쳐 그리기 (0) | 2022.02.22 |