ImGui 활용한 DirectX 11 3D를 이용한 2D를 만드는 내용입니다.
본 내용은 똑같이 사용할 수 없음을 알립니다. (참고 및 공부자료로 만들어진 내용임을 밝힙니다.)
전 과정에 대해 이해를 해야 다음 이 부분에 대한 이해를 할 수 있음을 밝힙니다
이전 자료)
STL (
STD(standard)
set
unordered-set
map
hash
balanced tree
Texture.h
#pragma once
class Texture
{
public:
static Texture* Make
(
wstring fileName,
Vector2 cutStart = Vector2(0, 0),
Vector2 cutSize = Vector2(0, 0)
);
private:
static map<wstring, ID3D11ShaderResourceView*> textureMap; //make에 접근할
public:
Texture(ID3D11ShaderResourceView* srv, Vector2 cutStart, Vector2 cutEnd);
~Texture();
private:
ID3D11ShaderResourceView* srv;
Vector2 textureSize;
Vector2 cutStart;
Vector2 cutEnd;
Vector2 uvStart;
Vector2 uvEnd;
};
Texture.cpp
기존에 filename이 등록이 안되어 있었다면 srv불러서 srv를 textureMap에다 넣어놓고
그런데 만약 filename이 있다면 조건을 pass하고 (이미 이전에 insert가 되어있는 것이기에)
srv = textureMap[fileName]; 을 찾아오면 된다
Texture*개체를 만들자 texture = new Texture(srv , cutStart, cutSize);
#include "stdafx.h"
#include "Texture.h"
Texture * Texture::Make(wstring fileName, Vector2 cutStart, Vector2 cutSize)
{
HRESULT hr;
ID3D11ShaderResourceView* srv; //자료형으로 부름
if (textureMap.count(fileName) < 1) //있느냐 없느냐 판단 1보다 작으면 한번도 불려지지 않은file
{
wstring fullPath = L"../_Textures/" + fileName;
D3DX11CreateShaderResourceViewFromFile
(
Device,
fullPath.c_str(),
NULL,
NULL,
&srv,
&hr
);
assert(SUCCEEDED(hr));
textureMap.insert(pair<wstring, ID3D11ShaderResourceView*>(fileName, srv));
}
srv = textureMap[fileName];
Vector2 cutEnd; //end지점
cutEnd.x = cutStart.x + cutSize.x;
cutEnd.y = cutStart.y + cutSize.y;//y도 시작지점에서 사이즈 만큼 더해주면 위치
Texture* texture = new Texture(srv, cutStart, cutEnd);
return nullptr;
}
Texture::Texture(ID3D11ShaderResourceView * srv, Vector2 cutStart, Vector2 cutEnd)
: srv(srv)
{
ID3D11Texture2D* texture;
srv->GetResource((ID3D11Resource **)&texture);
D3D11_TEXTURE2D_DESC textureDesc;
texture->GetDesc(&textureDesc);
textureSize = Vector2(textureDesc.Width, textureDesc.Height);
///////////////////////////////////////////////////////////////////////////////////
//start나 end가 0이면 이미지 전체를 쓰겠다는 것 무조건 1이하의 값이 들어간다.
//시작이 0이면 그냥 0을 넣어두고 끝도 1이하의 값이 들어가면 0이면 1을 넣어서
// 0 부터 1까지 전체 한장을 쓸때 1을 쓰겠다는 의미
uvStart.x = (cutStart.x > 0) ? cutStart.x / textureSize.x : 0;
uvStart.y = (cutStart.y > 0) ? cutStart.y / textureSize.y : 0; // 전체 사이즈에 대한 비율 uv에 대한 비율
uvEnd.x = (cutEnd.x > 0) ? cutEnd.x / textureSize.x : 1;
uvEnd.y = (cutEnd.y > 0) ? cutEnd.y / textureSize.y : 1;
//////////////////////////////////////////////////////////////////////////////////
this->cutStart = cutStart;
this->cutEnd.x = (cutEnd.x < 1) ? textureSize.x : cutEnd.x; //1보다 작은 0 / 값을 고정 0부터 끝까지 값을 써라
this->cutEnd.y = (cutEnd.y < 1) ? textureSize.y : cutEnd.y; //cut의 실제 datasize가 들어감
}
Texture::~Texture()
{
SAFE_RELEASE(srv);
}
main.cpp
#include "stdafx.h"
void InitScene()
{
Texture* texture = Texture::Make(L"SingleMario.png"); //static null리턴 기본 파라미터 값을 0으로 해둠
Texture* texture2 = Texture::Make(L"SingleMario.png");
int a = 0;
}
void DestroyScene()
{
}
void Update()
{
}
void Render()
{
}
STL에서 사용할 법한 것들은 대부분 다뤄보자
Map_Cpp / main.cpp
#include <stdio.h>
#include <vector> // STL 헤더가 안붙은 것 namespace가 구역에 묶여있다.
#include <list>
#include <set>
// namespace 명령
// C++표준으로 STL에 들어가 있다 그래서 헤더가 빠짐 std 스탠다드 약자
// ECMA (프로그래밍언어 표준 정함)
#include <string>
#include <map>
#include <algorithm> //stl안에서 자주 다루는 알고리즘 다 들어있다
namespace Character
{
class A
{
public:
int a = 10;
};
}
//class A
//{
//public:
// int a = 10;
//};//클래스 구역의 네임이 중복되면? 구역을 묶어 주는게 namespace
using namespace Character; // 소스에서 기본으로 쓰겠다.
using namespace std; //해당 구역내에
void main()
{
//Character::A* ob = new Character::A();
A* ob = new A();
//std::vector<int> vec; //원래 사용해야 할 경우 std를 없애려면 using namespace를 사용하면 됨
vector<int> vec;
vec.push_back(20);
vec.push_back(30);
vec.push_back(10);
vec.push_back(15);
for (int value : vec)
printf("list : %d\n", value);
sort(vec.begin(), vec.end(), );
printf("\n 정렬후 \n");
for (int value : vec)
printf("vector : %d\n", value);
//set
set<int> s;
s.insert(20);
s.insert(30);
s.insert(10);
s.insert(5);
//list //q구조를 만들때 사용
list<int> lists;
lists.push_back(20);
lists.push_back(30);
lists.push_back(10);
for (int value : lists)
printf("list : %d\n", value);
//iterator
set<int>::iterator iter;
for (iter = s.begin(); iter != s.end(); ++iter)
{
printf("%d\n", *iter); //가지고 있는 자료형이 됨
}
//set<int>::iterator
iter = s.find(5);
if (s.find(5) != s.end())
printf("찾음\n");
//구조체는 프리디케이션을 정의해야함 (함수포인터를 이해해야한다)
//pair
vector<pair<int, string>> values; //키 값상에 묶인 것
values.push_back(pair<int, string>(10, "홍길동"));
values.push_back(pair<int, string>(12, "이순신"));
values.push_back(pair<int, string>(15, "윤봉길"));
values.push_back(pair<int, string>(20, "박문수"));
//for(vecotr<pair<int, string>>::iterator it =) //이거대신 아래
for (pair<int, string> value : values)
printf("%d, %s\n", value.first, value.second.c_str()); //first 키 : second 값
//map<키자료형, 값자료형>
map<int, string> maps;
maps.insert(pair<int, string>(10, "홍길동"));
maps.insert(pair<int, string>(15, "안중근"));
for (pair<int, string> str : maps)
printf("%d, %s\n", str.first, str.second.c_str());
/////////////////////////////////////////////////////////////
//map을 이런방식으로 사용 가능
map<string, string> maps2;
maps2["킁킁"] = "후비적";
maps2["컹컹"] = "팅팅";
for (pair<string, string> str : maps2)
printf("%s, %s\n", str.first, str.second.c_str());
}
////////////
//set 접속한 사람들 중에 해당 아이디가 있느냐 일때
///////////
//
//////////
//중요) 밸런씨드 트리(균형을 유지 하는 트리)
/////////
//시간복잡도 2진트리에서 (중요) 2진탐색트리
///////
//균형 2진트리
// AVL / RB 균형을 유지하는 것
////////
//set이 균형을 유지시킴
///// set = BT unordered-set = hash라는 것을 사용함
// hashing은 암호화 랑도 관련
// 결과값으로 밸류를 적용할 수없음
//아이디 관리를 거의 hashing 사용 /간단하 게임 2D는 set으로 사용해도 되지만. 거의 사용안함
//Game에서 unordered-set을 자주 사용한다.
Texture가 만들어지면 이미 부를 파일을 또 텍스쳐가 부를 필요가 없다.
그렇게 하면 느려진다. 관리도 복잡
이미 부른 파일은 파일명하고 만들어진 텍스쳐 개체를 Map으로 키값상으로 정리 할 것이다.
*set : 어떤 값을 가지고 있는가?
*unordered-set hash 알고리즘 구조? :
*srv 텍스쳐를 ram에 부른다. vram에 이 텍스쳐가 어떻게 렌더링 될 것인가 알려줘야 한다. (알려주는 역할?)
텍스쳐가 정의 될때 부모자료형은 Resource
ID3D11Texture2D에 보면 ID3D11Resource로 부터 상속받은 애라고 볼 수 있다. 이렇게 상속받은 애들을
Resource라고 부름
다음시간)
참고할 만한 링크)
각주)
'Programming > DirectX 2D' 카테고리의 다른 글
[C++] DirectX static / texture / Uv 2D 3D (0) | 2021.12.07 |
---|---|
[C++] DirectX_Animation 2부/ static 함수/변수 (0) | 2021.12.03 |
[C++]DriectX Inheritance_상속 그 안의 속성(커플링) (0) | 2021.12.02 |