Adventure of 빠타박스
article thumbnail
728x90
728x90
SMALL

ImGui 활용한 DirectX 11 3D를 이용한 2D를 만드는 내용입니다.
본 내용은 똑같이 사용할 수 없음을 알립니다. (참고 및 공부자료로 만들어진 내용임을 밝힙니다.)
전 과정에 대해 이해를 해야 다음 이 부분에 대한 이해를 할 수 있음을 밝힙니다

이전 자료)

 

 

STL (

STD(standard)

set 

unordered-set

map 

hash

balanced tree 

 

namespace[각주:1]

 

using 선언(declaration)[각주:2]

 

 


 

 

 


 

 

 

 

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을 자주 사용한다.

 

 

 

 

sort 구조체 자료형이;나 임의로 정의한 자료형은 sort가 수행을 못한다.

 

 

 

 

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

 

 

 


각주) 

 

 

  1. 변수, 함수, 구조체, 클래스등을 서로 구분하기 위해서 이름으로 사용되는 다양한 내부 식별자(identifier)를 가지고 있다. 이름 충돌 문제를 namespace를 통해 해결,  내부식별자에 사용 될 수 있는 유효범위를 제공하는 선언적 영역 [본문으로]
  2. using지시자가 명시한 namespace의 모든 이름을 사용할 수 있다, 지정연산자를 사용하지 않고도 사용할 수 있게 해줌 [본문으로]
728x90
728x90
LIST
profile

Adventure of 빠타박스

@PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!