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라고 부름
다음시간)
[C++] DirectX static / texture / Uv 2D 3D
ImGui 활용한 DirectX 11 3D를 이용한 2D를 만드는 내용입니다. 본 내용은 똑같이 사용할 수 없음을 알립니다. (참고 및 공부자료로 만들어진 내용임을 밝힙니다.) 전 과정에 대해 이해를 해야 다음 이
ppatabox.tistory.com
참고할 만한 링크)
이진 트리 - 위키백과, 우리 모두의 백과사전
크기가 9이고, 높이가 3인 이진 트리 컴퓨터 과학에서, 이진 트리(二進-, 영어: binary tree)는 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조로, 자식 노드를 각각 왼쪽 자식 노드와
ko.wikipedia.org
해시 함수 - 위키백과, 우리 모두의 백과사전
이름을 0~15 사이의 정수값으로 매핑하는 해시 함수의 예. “John Smith”와 “Sandra Dee”라는 두 키 사이에 충돌이 존재한다. 해시 함수(hash function) 또는 해시 알고리즘(hash algorithm) 또는 해시함수알
ko.wikipedia.org
<해싱 (Hashing)>: 기본 개념
# 해싱이란? 대부분의 탐색 방법들은 탐색 키를 저장된 키 값과 반복적으로 비교하면서 탐색을 원하는 항목에 접근한다. 반면 해싱은 키 값에 직접 산술적인 연산을 적용하여 항목이 저장되어
mattlee.tistory.com
[STL 컨테이너] set & unordered_set & multiset
🔔 set 컨테이너
ansohxxn.github.io
씹어먹는 C++ - <10 - 2. C++ STL - 셋(set), 맵(map), unordered_set, unordered_map>
modoocode.com
Ecma 인터내셔널 - 위키백과, 우리 모두의 백과사전
Ecma 인터내셔널Ecma International약칭Ecma결성1961년목적정보 통신 기술 표준화 연구본부스위스 제네바공식 언어영어웹사이트Ecma 인터내셔널주요 인물요헨 프레드리히 (회장)이스트반 세베스테인 (
ko.wikipedia.org
각주)
'🅿🆁🅾🅶🆁🅰🅼🅼🅸🅽🅶 > DɪʀᴇᴄᴛX 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 |