• 하나의 매개변수를 취하는 생성자

오 이건 처음 알게 된 내용이다.

 

하나의 매개변수를 취하는 생성자는 사용자 데이터형으로 캐스팅될 때도 사용이 된다.

처음보면 A = 44가 말도 안되었지만 가능이였다ㅋㅋ
실행결과

 

A = 44; 구문에서

c++컴파일러는 먼저 type casting이 가능한지 확인한다.
찾을 때 매개변수가 하나인 생성자도 같이 찾아보기 때문에 이에 맞는 생성자가 있다면 호출되는 것.
A = MyClass(44)로 변환된다는 말.
고로 생성자에 44를 넣은 MyClass클래스의 임시 객체를 생성하여 대입한다.

 

이렇게 컴파일러에서 매개변수가 한 개인 생성자가 사용되는 때는 여러 가지가 있는데

방금 위의 코드로 예시를 들자면

 

1. 객체에 매개변수형 값으로 초기화할 때

2. 객체에 매개변수형 값을 대입할 때

3. 객체 타입의 자료형인 매개변수를 기대하는 함수에 생성자 매개변수 자료형으로 매개변수를 전달할 때

4. 객체타입의 값을 리턴하도록 선언된 함수가 생성자 매개변수의 자료형 값으로 리턴하려 할 때

5. 1~4 상황에서 생성자 매개변수의 자료형으로 변환할 수 있는 내장 데이터형을 사용할 때

말 그대로

생성자 매개변수의 자료형(여기서는 int)로 변환할 수 있는 내장 데이터형(flaot, double...)을 사용한 것뿐

진행순서는 들어온 실수 자료형을 int형으로 변환 후 다시 int형을 MyClass형으로 변경한다.

 

근데 이처럼 자동으로 형 변환을 해주는 기능을 막는 기능 또한 있다.

바로 explicit이다.

 


  • explicit

explicit 키워드를 사용하면 명시적으로만 사용 가능하다

즉 암시적 데이터형 변환을 못하게 막는다.

5가지 상황 중 가능했던 상황도 막을 수 있다.


  • 변환 함수 (conversion function)

위에서 어떠한 수를 객체로 타입 캐스팅했었는데

그 반대로도 가능하다.

 

위처럼 생성자가 아닌 변환 함수를 이용하는 것인데, 사용자 정의 강제 데이터형 변환이다.

어떠한 typeName으로 변환하려면 다음과 같은 형식으로 사용한다.

 

operator typeName( );

 

이처럼 변환 함수는 리턴타입, 매개변수를 가질 수 없게 만들어져 있다.

 

예시 코드이다.

실행결과

다만 이처럼 여러 개의 변환 함수가 있을 때

모호하지 말고 명확하게 타입을 써주자

 

근데 변환 함수가 한 개라면 어떤 걸로 변환될지 정해져 있기에 명확하지 않은 암시적으로도 가능하다.

근데 또 사람이 실수할 수도 있기 때문에 C++11에서 explicit과 함께 사용이 가능토록 변경되었다.

 


  • 변환과 프렌드

변환함수와 프렌드를 같이 사용할 경우 이러한 혼동이 올 수 있다.

  • 프렌드

클래스에서 다른 클래스의 private영역에 접근할 수 있는 방법은 보통 public 메서드들을 이용하여 접근한다.

그 외로 다른 방법을 하나 제공하는데 그것이 프렌드이다.

 

프렌드 멤버 함수

프렌드 함수

프렌드 클래스

 

정도로 분류할 수 있다.


  • 프렌드 멤버 함수

프렌드 멤버 함수의 필요성은 operator 오버로딩으로 예를 많이 든다.

첫 번째의 "cout << A + 4"같은 경우는

피연산자가 어떠한 클래스에 속한다는 것을 컴파일러가 인식하면,

그 연산자를 해당하는 연산자 함수로 대체하여 실행한다

 

두 번째의 "cout << 4 + A"같은 경우는

컴파일러가 +연산자를 수행할 때 피연산자의 자료형을 찾아서 그에 맞는 오버 로딩된 +연산자를 수행할 텐데

위 수식과 동일한 오버로딩된 함수가 없어서 에러가 난다.

 

만들고 싶어도 이항 연산자 함수의 매개변수는 1개로 정해져 있으며

이 매개변수도 연산자 뒤에 오는 피연산자로 들어오게끔 정해져 있다.

 

이 두 번째를 해결할 때 프렌드 멤버 함수가 좋은 선택지가 된다.

 

생성은 아주 쉽다.

앞에 함수 원형 앞에 friend만 붙여주면 된다.

이 프렌드 멤버 함수는 두 가지 의미를 가지고 있다.

 

1. 클래스 안에 선언되었지만 정확히 멤버함수는 아니다. => 멤버연산자를 사용하여 호출되지 않는다.

멤버함수는 아니다 : 그래서 클래스 외부에 정의가 될때 제한자가 빠진걸 볼수 있다.

2. 멤버함수는 아니라고 했지만 멤버함수와 동등한 접근권한을 가진다.

동등한 접근권한 : protected, private에 관계없이 접근 가능하다는 말

 

이렇게 생성된 프렌드 멤버 함수를 사용하면 된다.

 


  • 추가 내용

내가 friend 멤버 함수 코드를 작성할 때 밑처럼 항상 클래스 선언부에 정의까지 작성하긴 했는데

이렇게 보면 operator+(int, MyClass) 함수가 MyClass에 속해있다고 생각이 들겠지만

사실 외부의 함수를 MyClass에서 friend화 한다고 생각하는 게 다른 friend종류를 이해하기에 편하고 맞는 거 같다.

1
2

그렇기 때문에 저 operator+(int, MyClass)가 MyClass의 멤버함수로가 아닌 전역적으로 사용될 수 있는 것이다.

 

 

 

결과물

정규화 된 타일맵에서의 위치를 구한다.

 


코드

Terrain.cpp

현재 위치의 높이를 float으로 반환

GetHeightDemo.cpp

 


추가

이 방법의 단점

더보기

각타일이 크기가 정규화 되어야 사용가능하다.

비정규화된 맵에서 높이를 가져오려면 Trace를 사용해야한다.

'DirectX 11 > 코드 분석' 카테고리의 다른 글

Normal vector / Shadow  (0) 2022.02.09
Height map  (0) 2022.02.08
Texture Sampler  (0) 2022.02.08
Texture  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08

결과물

 

각 타일의 수직벡터 Line debuging


코드

Terrian.fx

 

Terrian.cpp

[ 여기서 구하고자 하는 Normal값은 각 타일 삼각형의 노멀값이다 // 음영을 계산하기 위해 구함 ]

'DirectX 11 > 코드 분석' 카테고리의 다른 글

Get Height  (0) 2022.02.09
Height map  (0) 2022.02.08
Texture Sampler  (0) 2022.02.08
Texture  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08

동차 표기법은 무엇인가 많이 검색하고 찾아봤지만 나에게는 다 두루뭉실하게 들렸다ㅠ

 

내가 정의한 동차 표기법은

"차원을 하나 더 추가하는 표기법" 이다.

하나 더 추가하는 이유는 그 차원의 값을 통하여 여러가지 계산을 쉽게 할 수 있기 때문이다.

실제로 차원이 더 늘어나는게 아님


예를들어 3차원에서 3x3행렬으로도 회전, 스케일링 등의 선형변환을 나타낼 수 있다.

하지만 이동은 3x3행렬로 표현할 수 없다

 

그래서 한차원을 추가해서 4x4행렬로 만든다면 행렬곱을 통하여 이동 및 여러 변환을 쉽게 시킬수가 있다.

한차원을 추가 : 3차원 (x, y, z) => 4차원 (x, y, z, w)


또 다른 기능이 있는데 방향벡터와 위치벡터를 구분해줄수있다.

벡터에는 위치를 나타내는 위치벡터와 방향을 나타내는 방향벡터가 있다.

 

근데 방향벡터에 이동이 필요한가?

한다면 정규화된 값이 방향벡터이라 의미가 없다고 생각한다.

 

그렇기 때문에 방향 벡터는 w의 값을 0, 위치벡터는 w의 값을 1로 사용하여

두 벡터를 구분할 수 있다.

 

이는 VertexShader에서 확인이 가능한데

vertex shader의 매개변수 구조체

다들 Vs를 작성해봤었다면 정점의 위치는 float4, 방향벡터는 float3로 정의하여 값을 옮겼을 것이다.

위치데이터가 float4인 이유는 바로 저 동차표기로 이동을 계산해야하기 때문이다.

그래서 float4로 정의하면 w값에 1이 초기값으로 들어간다.

 

Normal은 방향벡터로 w가 쓸일이 없으니까 굳이 w값까지 필요 없기에 float3로 받아오는것이다.


또 다른 사용의도가 있는데 이번에는 Pixel Shader에서 화면 비율과 관련된 의도인데

아직 사용을 안해봐서 직접해보고 추가로 작성해야겠다.

 

 


https://coding-groot.tistory.com/89

 

Homogeneous Coordinates를 왜 쓸까?

Homogeneous Coordinates에 대한 정리 수학적으로 $Homogeneous \ Coordinates$를 왜 쓰는지 이해는 못했다. 하지만 실용적으로 어떤 편의를 위해서 쓰는지는 알겠다. 검색하면서 정리한 여러 사용법에 대해서

coding-groot.tistory.com

https://enghqii.tistory.com/59?category=206685 

 

'DirectX 11 > 개념 정리' 카테고리의 다른 글

D3D11_USAGE / Resource Usage Type  (0) 2022.02.08
Vertex Shader, Pixel Shader, Rasterizer  (0) 2022.02.07
Device & Device Context / COM객체  (0) 2022.02.06

결과물

 


코드

 


추가

Height map

더보기

채널의 값을 불러와 높이정보로 사용할 수 있는 이미지를 뜻한다.

모두 흑백사진인데 이는 검은색( 0, 0, 0 ) 흰색 ( 1, 1, 1 ) 색상값을 통하여

0 ~ 1까지의 높이 비율로 표현할 수 있다.

많은 HeightMap

 

'DirectX 11 > 코드 분석' 카테고리의 다른 글

Get Height  (0) 2022.02.09
Normal vector / Shadow  (0) 2022.02.09
Texture Sampler  (0) 2022.02.08
Texture  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08

결과물


코드

TextrueSampler.fx

픽셀셰이더 두개

 


'DirectX 11 > 코드 분석' 카테고리의 다른 글

Normal vector / Shadow  (0) 2022.02.09
Height map  (0) 2022.02.08
Texture  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08
Index Buffer / World Scale, World Translation  (0) 2022.02.08

결과물


코드

TextureDemo.cpp

 


Texture.fx

 


추가

셰이더 리소스 뷰(Shader Resource View)

더보기

먼저 "리소스 뷰"는 리소스를 파이프라인에 연결해주는 객체이다.

'View' 라는 단어가 붙은 이유는 리소스를 특정 '시각'으로 해석한다는 의미이다.

 

그래서 종류가 4가지가 있는데 그중 셰이더 리소스 뷰는 

프로그램 가능 셰이더 단계가 리소스를 읽을 수 있게 한다.

프로그램 가능 셰이더 단계: vs, ps, gs...

읽을 수만 있기 때문에 기록하지는 못한다.

 

Sampler

더보기

계산된 픽셀에 맞도록 이미지를 맞춰주는것

이미지를 맞춰주는것 : address mode라는것과 filter가 있다.

 

  • address mode

uv좌표에서 u값이나 v값이 1이 넘어가면 어떻게 될까?

그 부분을 어떻게 처리할지 설정하는게 address mode이다.

u값, v값이 1보다 큰 픽셀에 어떻게 처리되는지 설정이 된다.
  • filter

우리가 넣을 텍스쳐는 크기가 정해져있다.

근데 그 텍스쳐를 매핑한 (정점4개로 이루어진)사각형의 크기가 크면 확대될것이고

사각형의 크기가 작으면 축소될것이다.

 

이는 즉 축소된다면 픽셀은 줄어들것이고 그 픽셀들의 색상은 어떻게 결정하고

확대되면 픽셀은 늘어날것인데 추가된 픽셀의 색상은 어떻게 결정할것인가?

=> 여러가지 보간방법으로 색상을 결정하는게 filter의 역할이다.

각 다른 보간법 / Anisotropic는 게임설정에 많이 나오던 MSAA와 연결된다.

※Linear의 식은 'A'------랜덤한 지점'x'------'B' 가 있다면

(1 - x) * A + x * B 이다.

 

 

보간기(Interpolator)

더보기

 

uv값은 정점의 실수 값이다. 

픽셀셰이더는 픽셀에 대한 계산인데 어떻게 계산이 될까? 궁금했다.

 

그건 레스터라이저단계에서 레스터라이저가

정점의 위치데이터를 가지고 픽셀들을 계산해준다면

같은 레스터라이저 단계에서 "보간기"라는게 정점의 다른데이터들을 픽셀에 맞게 보간해준다.

다른데이터 : 정점의 Normal값, 정점의 uv값...등등

그래서 픽셀셰이더에서 보간기로 수정된 uv값을 이용하여 계산할 수 있다.

 

텍스쳐 추가시

더보기

텍스쳐를 추가할때 사이즈를 2의 n승 에 맞게 가져오는게 성능상 좋다.

자동으로 2의n승에 맞게 사이즈가 조정되어 가져온다고한다.

ex) 589사이즈로 가져온다면 512로 조정된다.

 

 

https://www.3dgep.com/texturing-lighting-directx-11/

 

Texturing and Lighting in DirectX 11

In this tutorial you will learn how to implement Texturing and Lighting using a Pixel Shader in DirectX 11.

www.3dgep.com

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=masca140&logNo=220719096462 

 

Direct3D 11의 자원들 (1)

자원을 이야기 하자면 자원 사용의 두 측면을 모두 살펴보는 것이 타당하다. 응용 프로그램의 관점에서 중...

blog.naver.com

 

'DirectX 11 > 코드 분석' 카테고리의 다른 글

Height map  (0) 2022.02.08
Texture Sampler  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08
Index Buffer / World Scale, World Translation  (0) 2022.02.08
World, View, Projection  (0) 2022.02.08

+ Recent posts