반응형
1. 배경으로 띄우기.
smaple.h
#pragma once
#pragma comment(lib, "TLib.lib")
#include "zCore.h"
#include "mathHeader_L.h"
namespace Lypi
{
class Sample : public zCore
{
//실제 텍스쳐를 표시할 때 사용할 리소스
ComPtr<ID3D11Texture2D> m_pTexture;
D3D11_TEXTURE2D_DESC m_TextureDesc;
//백버퍼용 리소스
ComPtr<ID3D11Texture2D> m_pBackBuffer;
D3D11_TEXTURE2D_DESC m_BackBuffereDesc;
public:
ID3D11Texture2D * GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo = nullptr);
public:
bool Init();
bool Frame();
bool Render();
bool Release();
public:
Sample(LPCTSTR LWndName);
virtual ~Sample();
};
}
sample.cpp
#include "sample.h"
namespace Lypi
{
Sample::Sample(LPCTSTR LWndName) : zCore(LWndName)
{
m_pTexture = nullptr;
}
ID3D11Texture2D* Sample::GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo)
{
HRESULT hr;
ID3D11Texture2D* texture = nullptr;
ID3D11Resource* pRes = nullptr;
hr = D3DX11CreateTextureFromFile(g_pD3dDevice, filename, pLoadInfo, nullptr, &pRes, nullptr);
if (FAILED(hr)) {
DEBUGMSG("이미지 불러오기 실패");
return nullptr;
}
pRes->QueryInterface(__uuidof(ID3D11Texture2D), (LPVOID*)&texture);
pRes->Release();
return texture;
}
bool Sample::Init()
{
//스왑체인에 지정된 버퍼의 크기로 백버퍼를 만든다.
HRESULT hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer);
if (FAILED(hr)) {
return false;
}
//백버퍼 정보를 가져온다.
m_pBackBuffer->GetDesc(&m_BackBuffereDesc);
//CopyResource()함수를 사용할 경우 반드시 백 버퍼의 크기보다 크거나 같아야 한다.
//CopyResourceRegion()함수를 사용할 경우 원하는 크기로 지정할 수 있다.
D3DX11_IMAGE_LOAD_INFO loadInfo;
loadInfo.Width = m_BackBuffereDesc.Width; // 텍스쳐의 너비. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Height = m_BackBuffereDesc.Height; // 텍스쳐의 높이. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Depth = D3DX11_DEFAULT; // 텍스쳐의 깊이. 볼륨 텍스처에만 적용된다.
loadInfo.FirstMipLevel = 0; // 텍스쳐 최고 해상도 밉맵 수준.
loadInfo.MipLevels = 1; // 텍스쳐 밉맵의 최대 수. (최소 1이어야 한다.)
loadInfo.Usage = D3D11_USAGE_DEFAULT; // 텍스쳐 리소스의 용도
loadInfo.BindFlags = 0; // 텍스쳐를 바인딩할 파이프라인 단계.
loadInfo.CpuAccessFlags = 0; // CPU가 텍스쳐에 접근할 수 있는 권한 설정. 0이면 접근 불가.
loadInfo.MiscFlags = 0; // 리소스에 대한 기타 속성들.
loadInfo.Format = m_BackBuffereDesc.Format; // 텍스쳐가 로드된 후의 형식
loadInfo.Filter = D3DX11_FILTER_LINEAR; // 지정된 필터를 사용하여 텍스쳐 필터링.
loadInfo.MipFilter = D3DX11_FILTER_NONE; // 지정된 필터를 사용하여 생성된 밉맵을 필터링.
loadInfo.pSrcInfo = 0; // 기존 이미지에 대한 정보.
m_pTexture = GetTexture2DFromFile(TEXT("../../INPUT/DATA/image/Desert.jpg"), &loadInfo);
if (m_pTexture == nullptr) {
return false;
}
m_pTexture->GetDesc(&m_TextureDesc);
return true;
}
bool Sample::Frame()
{
return true;
}
bool Sample::Render()
{
//CopyResource()함수를 사용할 경우 반드시 백 버퍼의 크기보다 크거나 같아야 한다.
g_pD3dContext->CopyResource(m_pBackBuffer.Get(), m_pTexture.Get());
return true;
}
bool Sample::Release()
{
return true;
}
Sample::~Sample(void)
{
}
}2. 크기를 지정해서 띄운 뒤 움직이기.
sample.h
#pragma once
#pragma comment(lib, "TLib.lib")
//이 부분은 header에 추가하는 것이 좋다.
//timeGetTime()
#include < mmsystem.h >
#pragma comment (lib, "winmm.lib" )
#include "zCore.h"
#include "mathHeader_L.h"
namespace Lypi
{
class Sample : public zCore
{
//실제 텍스쳐를 표시할 때 사용할 리소스
ComPtr<ID3D11Texture2D> m_pTexture;
D3D11_TEXTURE2D_DESC m_TextureDesc;
//백버퍼용 리소스
ComPtr<ID3D11Texture2D> m_pBackBuffer;
D3D11_TEXTURE2D_DESC m_BackBuffereDesc;
//이미지 위치 지정용
int m_iPosX, m_iPosY;
public:
ID3D11Texture2D * GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo = nullptr);
public:
bool Init();
bool Frame();
bool Render();
bool Release();
public:
Sample(LPCTSTR LWndName);
virtual ~Sample();
};
}
sample.cpp
#include "sample.h"
namespace Lypi
{
Sample::Sample(LPCTSTR LWndName) : zCore(LWndName)
{
m_pTexture = nullptr;
}
ID3D11Texture2D* Sample::GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo)
{
HRESULT hr;
ID3D11Texture2D* texture = nullptr;
ID3D11Resource* pRes = nullptr;
hr = D3DX11CreateTextureFromFile(g_pD3dDevice, filename, pLoadInfo, nullptr, &pRes, nullptr);
if (FAILED(hr)) {
DEBUGMSG("이미지 불러오기 실패");
return nullptr;
}
pRes->QueryInterface(__uuidof(ID3D11Texture2D), (LPVOID*)&texture);
pRes->Release();
return texture;
}
bool Sample::Init()
{
//스왑체인에 지정된 버퍼의 크기로 백버퍼를 만든다.
HRESULT hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer);
if (FAILED(hr)) {
return false;
}
//백버퍼 정보를 가져온다.
m_pBackBuffer->GetDesc(&m_BackBuffereDesc);
//CopyResource()함수를 사용할 경우 반드시 백 버퍼의 크기보다 크거나 같아야 한다.
//CopyResourceRegion()함수를 사용할 경우 원하는 크기로 지정할 수 있다.
D3DX11_IMAGE_LOAD_INFO loadInfo;
loadInfo.Width = 300; // 텍스쳐의 너비. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Height = 400; // 텍스쳐의 높이. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Depth = D3DX11_DEFAULT; // 텍스쳐의 깊이. 볼륨 텍스처에만 적용된다.
loadInfo.FirstMipLevel = 0; // 텍스쳐 최고 해상도 밉맵 수준.
loadInfo.MipLevels = 1; // 텍스쳐 밉맵의 최대 수. (최소 1이어야 한다.)
loadInfo.Usage = D3D11_USAGE_DEFAULT; // 텍스쳐 리소스의 용도
loadInfo.BindFlags = 0; // 텍스쳐를 바인딩할 파이프라인 단계.
loadInfo.CpuAccessFlags = 0; // CPU가 텍스쳐에 접근할 수 있는 권한 설정. 0이면 접근 불가.
loadInfo.MiscFlags = 0; // 리소스에 대한 기타 속성들.
loadInfo.Format = m_BackBuffereDesc.Format; // 텍스쳐가 로드된 후의 형식
loadInfo.Filter = D3DX11_FILTER_LINEAR; // 지정된 필터를 사용하여 텍스쳐 필터링.
loadInfo.MipFilter = D3DX11_FILTER_NONE; // 지정된 필터를 사용하여 생성된 밉맵을 필터링.
loadInfo.pSrcInfo = 0; // 기존 이미지에 대한 정보.
m_pTexture = GetTexture2DFromFile(TEXT("../../INPUT/DATA/image/lightmap.bmp"), &loadInfo);
if (m_pTexture == nullptr) {
return false;
}
m_pTexture->GetDesc(&m_TextureDesc);
return true;
}
bool Sample::Frame()
{
int iCenterX = m_BackBuffereDesc.Width / 2 - m_TextureDesc.Width / 2;
int iCenterY = m_BackBuffereDesc.Height / 2 - m_TextureDesc.Height / 2;
m_iPosX = cosf(timeGetTime() / 1000.0f) * iCenterX + iCenterX;
m_iPosY = sinf(timeGetTime() / 1000.0f) * iCenterY + iCenterY;
return true;
}
bool Sample::Render()
{
//2차원 텍스쳐지만 위치는 3차원으로 표시한다.
//원본 텍스쳐의 전체 선택 및 일부 영역 선택.
D3D11_BOX sourceRegion;
sourceRegion.left = 0;
sourceRegion.right = m_TextureDesc.Width;
sourceRegion.top = 0;
sourceRegion.bottom = m_TextureDesc.Height;
sourceRegion.front = 0;
sourceRegion.back = 1;
//CopyResourceRegion()함수 : 원본텍스쳐의 전체 및 일부 영역을 백 버퍼의 0,0 위치에 복사함.
g_pD3dContext->CopySubresourceRegion(m_pBackBuffer.Get(), 0, m_iPosX, m_iPosY, 0, m_pTexture.Get(), 0, &sourceRegion);
return true;
}
bool Sample::Release()
{
return true;
}
Sample::~Sample(void)
{
}
}
3. 배경 이미지에 접근해서 변경하기.
sample.h
#pragma once
#pragma comment(lib, "TLib.lib")
#include "zCore.h"
#include "mathHeader_L.h"
namespace Lypi
{
class Sample : public zCore
{
//실제 텍스쳐를 표시할 때 사용할 리소스
ComPtr<ID3D11Texture2D> m_pTextureSrc;
ComPtr<ID3D11Texture2D> m_pTextureDest;
D3D11_TEXTURE2D_DESC m_TextureDesc;
//백버퍼용 리소스
ComPtr<ID3D11Texture2D> m_pBackBuffer;
D3D11_TEXTURE2D_DESC m_BackBuffereDesc;
D3D11_BOX m_SourceRegion;
public:
ID3D11Texture2D* GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo = nullptr);
ID3D11Texture2D* CopyTexture(ID3D11Texture2D* pSrcTexture);
void WriteDotPixel(ID3D11Texture2D* pTexDest);
public:
bool Init();
bool Frame();
bool Render();
bool Release();
public:
Sample(LPCTSTR LWndName);
virtual ~Sample();
};
}
sample.cpp
#include "sample.h"
namespace Lypi
{
Sample::Sample(LPCTSTR LWndName) : zCore(LWndName)
{
m_pTextureSrc = nullptr;
m_pTextureDest = nullptr;
m_pBackBuffer = nullptr;
}
ID3D11Texture2D* Sample::GetTexture2DFromFile(LPCWSTR filename, D3DX11_IMAGE_LOAD_INFO* pLoadInfo)
{
HRESULT hr;
ID3D11Texture2D* texture = nullptr;
ID3D11Resource* pRes = nullptr;
hr = D3DX11CreateTextureFromFile(g_pD3dDevice, filename, pLoadInfo, nullptr, &pRes, nullptr);
if (FAILED(hr)) {
DEBUGMSG(L"이미지 불러오기 실패");
return nullptr;
}
pRes->QueryInterface(__uuidof(ID3D11Texture2D), (LPVOID*)&texture);
pRes->Release();
return texture;
}
ID3D11Texture2D* Sample::CopyTexture(ID3D11Texture2D* pSrcTexture)
{
HRESULT hr;
D3D11_TEXTURE2D_DESC desc;
pSrcTexture->GetDesc(&desc);
ID3D11Texture2D* NewTexture2D;
hr = g_pD3dDevice->CreateTexture2D(&desc, 0, &NewTexture2D);
if (FAILED(hr)) {
MessageBox(0, L"CreateTexture2D FAILED", 0, 0);
return nullptr;
}
g_pD3dContext->CopyResource(NewTexture2D, pSrcTexture);
return NewTexture2D;
}
void Sample::WriteDotPixel(ID3D11Texture2D* pTexDest)
{
HRESULT hr;
D3D11_TEXTURE2D_DESC desc;
pTexDest->GetDesc(&desc);
D3D11_MAPPED_SUBRESOURCE MappedFaceDest;
hr = g_pD3dContext->Map((ID3D11Resource*)pTexDest, 0, D3D11_MAP_READ_WRITE, 0, &MappedFaceDest);
if (SUCCEEDED(hr))
{
BYTE* pDestBytes = (BYTE*)MappedFaceDest.pData;
for (UINT y = 0; y < desc.Height; y++) {
BYTE* pDest = pDestBytes;
for (UINT x = 0; x < desc.Width; x++) {
if (x % 100 == 0) {
//지정된 위치의 픽셀의 색을 바꾼다.
*pDest++ = 0; //R
*pDest++ = 0; //G
*pDest++ = 255; //B
*pDest++ = 255; //A
}
else {
pDest += 4; // 바이트 이동.
}
}
//바이트 이동
pDestBytes += MappedFaceDest.RowPitch;
}
g_pD3dContext->Unmap(pTexDest, 0);
}
}
bool Sample::Init()
{
//스왑체인에 지정된 버퍼의 크기로 백버퍼를 만든다.
HRESULT hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer);
if (FAILED(hr)) {
return false;
}
//백버퍼 정보를 가져온다.
m_pBackBuffer->GetDesc(&m_BackBuffereDesc);
//CopyResource()함수를 사용할 경우 반드시 백 버퍼의 크기보다 크거나 같아야 한다.
//CopyResourceRegion()함수를 사용할 경우 원하는 크기로 지정할 수 있다.
D3DX11_IMAGE_LOAD_INFO loadInfo;
loadInfo.Width = m_BackBuffereDesc.Width; // 텍스쳐의 너비. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Height = m_BackBuffereDesc.Height; // 텍스쳐의 높이. 텍스쳐 크기와 다를 경우 자동으로 확대,축소가 이뤄진다.
loadInfo.Depth = D3DX11_DEFAULT; // 텍스쳐의 깊이. 볼륨 텍스처에만 적용된다.
loadInfo.FirstMipLevel = 0; // 텍스쳐 최고 해상도 밉맵 수준.
loadInfo.MipLevels = 1; // 텍스쳐 밉맵의 최대 수. (최소 1이어야 한다.)
loadInfo.Usage = D3D11_USAGE_STAGING; // 텍스쳐 리소스의 용도
loadInfo.BindFlags = 0; // 텍스쳐를 바인딩할 파이프라인 단계.
loadInfo.CpuAccessFlags
= D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; // CPU가 텍스쳐에 접근할 수 있는 권한 설정. 읽고 쓰기가 가능하게 설정.
loadInfo.MiscFlags = 0; // 리소스에 대한 기타 속성들.
loadInfo.Format = m_BackBuffereDesc.Format; // 텍스쳐가 로드된 후의 형식
loadInfo.Filter = D3DX11_FILTER_LINEAR; // 지정된 필터를 사용하여 텍스쳐 필터링.
loadInfo.MipFilter = D3DX11_FILTER_NONE; // 지정된 필터를 사용하여 생성된 밉맵을 필터링.
loadInfo.pSrcInfo = 0; // 기존 이미지에 대한 정보.
m_pTextureSrc = GetTexture2DFromFile(TEXT("../../INPUT/DATA/image/Desert.jpg"), &loadInfo);
if (m_pTextureSrc == nullptr) {
return false;
}
m_pTextureDest = CopyTexture(m_pTextureSrc.Get());
WriteDotPixel(m_pTextureDest.Get());
return true;
}
bool Sample::Frame()
{
return true;
}
bool Sample::Render()
{
//CopyResourceRegion()함수 : 원본텍스쳐의 전체 및 일부 영역을 백 버퍼의 0,0 위치에 복사함.
g_pD3dContext->CopyResource(m_pBackBuffer.Get(), m_pTextureDest.Get());
return true;
}
bool Sample::Release()
{
return true;
}
Sample::~Sample(void)
{
}
}
어차피 다이렉트에서 2D를 많이 쓰지도 않지만 쓰더라도 이 방식보단 다음에 소개할 방법을 더 많이 쓴다.
반응형