Hello world

기초 2016. 8. 11. 17:28

cout 은 클래스다

<< 는 왼쪽 시프트 연산자

cout에서는 추출연산자.


문자와 문자열


문자는 1byte짜리 한글자

한글은 아스키 코드에 있지 않으므로 문자가 아니다.


유니코드 = 모든 글자를 2byte로 해뒀다.


2byte 이상은 문자열


문자는 'a' 문자열은 "a"


'\0' 는 문자 -> 이스케이프 문자열 이걸 만나면 문자열의 끝이다.


endl 은 함수 호출이다.


상수 - 변하지 않는 숫자


함수의 상수화

내가 만들어 놓은 함수를 바꾸지 않겠다.


변수 - 변할 가능성이 있는 숫자

정수 ( 양수 , 0 , 음수 ) 숫자의 크기가 정해져있다. 그 용량 만큼 변수를 사용하겠다는 의미

실수 - 양수 + 부호비트

문자열


자료형

char (1byte) 아스키 코드와 매칭되어있어서 숫자를 문자로 인식한다.

-128 ~ 127 / 0 ~ 255

short (2byte) 65536 개 0 ~ 65535 개 __int16

int (4byte) int가 4byte가 아닐때가 있었어서 long이랑 크기가 같다. __int32

long (4byte) __int32

long long (8byte) __int64


bit는 컴퓨터가 연산하는 단위 2의 제곱

byte 사용자가 저장하는 단위 2의 3제곱


unsigned 는 양수만 쓸때 정수형 자료형에만 쓸 수 있다.


실수 자료형

float (4byte) 2byte는 정수 2byte는 실수 / 소수점 이하 6~7자리

double (8byte) 4byte는 정수 4byte는 실수 / 소수점 이하 12~15자리


컴파일러에 따라서 유효숫자 갯수가 정해진다.


float a = 3.14; 실수를 발견하면 double로 간주한다.

그래서 경고가 뜬다. 8byte를 4byte로 바꾸는 것이기 때문에 그래서 3.14f를 사용해서 3.14f 0.f 이렇게 알려줘야한다.


char 65번 = A 97번 = a


bool (1byte) 저장하는 단위가 1byte부터이기 때문에 0이 아니면 다 1





'기초' 카테고리의 다른 글

운영체제 스케줄링 기법  (0) 2016.10.20
까먹지 말자  (0) 2016.08.16
typedef 관련  (0) 2016.05.22
using 키워드  (0) 2016.03.02
시스템  (0) 2016.01.18
posted by 알쿠미

Device , DeviceContext 생성

DirectX11 2016. 7. 3. 19:08

Device, DeviceContext 는 물리적인 그래픽 장치 하드웨어에 대한 소프트웨어 제어기라고 생각하면 된다.


ID3D11Device 인터페이스는 기능 지원 점검과 자원 할당에 쓰인다.


ID3D11DeviceContext 인터페이스는 렌더 대상을 설정하고, 자원을 그래픽 파이프 라인에 묶고, GPU가 렌더링 명령들을 지시하는 데 쓰인다.


Device와 DeviceContext를 생성하는 함수


HRESULT D3D11CreateDevice {

IDXGIAdapter *pAdapter, 

D3D_DRIVER_TYPE DriverType,

HMODULE Software,

UINT Flags,

CONST D3D_FEATURE_LEVEL *pFeatureLevels,

UINT FeatureLevels,

UINT SDKVersion,

ID3D11Device **ppDevice,

D3D__FEATURE_LEVEL *pFeatureLevel,

ID3D11DeviceContext **ppImmediateContext

};


1. pAdapter : 이 함수로 생성할 Device를 나타내는 디스플레이 어댑터를 지정한다.

이 메개 변수에 널 값을 지정하면 기본 디스플레이 어댑터가 사용된다.


2. DriverType : 일반적으로 렌더링에 3차원 그래픽 가속이 적용되게 하기 위해선 이 매개변수에 D3D_DRIVER_TYPE_HARDWARE를 지정한다.

다른 매개 변수로는 

ⓐ D3D_DRIVER_TYPE_REFERENCE

  - 표준 장치를 생성한다. 즉, 하드웨어가 지원하지 않는 기능을 시험할때, 구동기의 버그를 시험할때 사용한다.

ⓑ D3D_DRIVER_TYPE_SOFTWARE

  - 3차원 하드웨어를 흉내내는 소프트웨어 구동기를 생성한다.

ⓒ D3D_DRIVER_TYPE_WARP

  - Direct3D 10.1 소프트웨어 구동기를 생성한다. (D3D11버전을 지원하지 않는다.)


3. Software: 소프트웨어 구동기를 지정한다.


4. Flags: 추가적인 장치 플래그들을 지정한다.

(흔히 쓰이는 2개)

ⓐ D3D_CREATE_DEVICE_DEBUG : 디버그 모드 빌드에서 디버그 계층을 활성화 하려면 이 플래그를 설정 해야한다.

( 이 플래그를 지정하면 VC++출력창에 디버그 메세지를 보낸다. )


ⓑ D3D_CREATE_DEVICE_SINGLETHREADED : Direct3D가 여러 개의 스레드에서 호출되지 않는다는 보장이 있을 때, 이 플래그를 지정하면 성능이 향상된다.

( 이 플래그가 활성화 되면 ID3D11Device::CreateDeferredContext의 호출은 실패한다.)

5. pFeatureLevels : D3D_FEATURE_LEVEL 형식의 배열 (널 값이면 최고수준)


6. FeatureLevels : pFeatureLevels 의 갯수 (위에 값이 널값이면 0으로 지정하면 된다.)


7. SDKVersion : 항상 D3D11_SDK_VERSION을 지정한다.


8. ppDevice : 함수가 생성한 Device


9 pFeatureLevel : 위에서 설정된 FeatureLevel을 반영한다.


10. ppImmediateContext : 생성된 DeviceContext를 돌려준다.


위의 매개변수가 Immediate라는 것은 다른 지연된 DeferredContext도 있다.

주 렌더링 스레드에는 Immediate를 사용하고

워커 스레드 에선 임의의 갯수인 Deferred를 사용한다.

1. 각 워커 스레드는 그리기 명령들을 명령목록(ID3D11CommandList)에 기록한다.

2. 주 렌더링 스레드는 Immediate를 이용해서 워커 스레드 명령목록에 있는 명령들을 기록한다.

명령목록을 생성하는데 시간이 걸린다면 다중 코어 시스템에서 이처럼 명령목록들을 병렬로 생성하여 성능향상을 꾀할 수 있다.


posted by 알쿠미

텍스처 관련

DirectX11/Direct3D 초기화 2016. 7. 3. 17:31

자원 뷰 (Resource View)

자원 뷰는 자원을 파이프라인에 묶는데(bind) 사용되는 객체이다.


자원뷰의 종류

렌더 타겟 뷰 ( ID3D11RenderTargetView )

깊이/스텐실 뷰 ( ID3D11DepthStencilView )

셰이더 자원 뷰 ( ID3D11ShaderResourceView )

순서 없는 접근 뷰 ( ID3D11UnordereAccessView )


각각의 자원뷰에 대한 설명은 참고 링크에 있다.


자원 뷰들은 독립적으로 두가지 일을 한다.

1. Direct3D에게 자원의 사용방식(즉, 파이프라인의 어떤 단계에 묶을 것인지)을 알려주는 것

2. 생성 시점에서 무형식을 지정한 자원 형식의 구체적인 형식을 결정하는 것

( 무형식 자원의 경우 텍스처 원소를 한 파이프 라인 단계에서는 부동소수점 값으로서 사용하고 다른 단계에서는 정수로서 사용하는 것이 가능함을 뜻한다.)


D3D11 에선 리소스를 생성하고 자원 뷰를 사용해서 파이프 라인에 묶는다.

묶는 방법은

D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE 

위 처럼 단계를 지정한 결속 플래그를 사용해서 묶는다.


즉, 텍스처를 사용하기 위해선 그 텍스처에 자원뷰가 필요하고 자원뷰를 파이프라인에 묶어서 사용한다.(텍스처가 파이프라인에 묶이는것이 아니라 자원뷰가 묶이는 것)


텍스처의 플래그가 설정되지 않은 뷰에 대해선 뷰를 생성할 수 없다.

텍스처가 D3D11_BIND_DEOTG_STENCIL 플래스가 설정되지 않았으면 ID3D11DepthStencilView를 생성할 수 없다.


D3D11에서 이렇게 하는 이유는?

실행시점 모듈(런타임)과 구동기(드라이버)가 유효성 점검과 매핑을 뷰 생성 시점에서 수행할 수 있기 때문에 결속 시점에서의 형식 점검이 최소화된다.

따라서 텍스처를 렌더대상과 쉐이더 자원으로 사용할 때는 두 개의 뷰를 생성할 필요가 있다.


* 참고

[리소스 뷰에 대한 대략적인 설명]

http://grandstayner.tistory.com/entry/DirectX11%EC%9D%98-%EC%9E%90%EC%9B%90-%EB%B7%B0


[D3D11 텍스쳐 생성]

http://blog.naver.com/sorkelf/40169749877


[자원의 종류 등등]

http://grandstayner.tistory.com/entry/DirectX-11%EC%9D%98-%EC%9E%90%EC%9B%90%EB%93%A4%EC%9D%98-%EA%B0%9C%EC%9A%94


그 외 : 다중 표본화


이해한 것으로는 다중 표본화란 픽셀 하나만 가지고 하나의 픽셀을 출력하는 것이 아니라 화면을 부드럽게 만들기 위해 픽셀의 인접 픽셀들을 이용해서 화면을 부드럽게 출력하는 것이 아닐까 싶다...

 표본화를 많이 할수록 품질은 좋아지겠지만 속도가 느려진다.

#define D3D11_MAXMULTISAMPLE_SAMPLE_COUNT ( 32 )

 최대 표본 갯수는 32로 정해져 있지만 표본을 4개에서 8개 추출해서 하는 경우가 많다.

(심오한 내용으로 보이니 조금만 알고가는 정도로 넘어가자)

'DirectX11 > Direct3D 초기화' 카테고리의 다른 글

화면 출력  (0) 2016.07.02
Direct3D 기본  (0) 2016.07.02
posted by 알쿠미