분류 전체보기

·C++
void func(int& x){ x = 20;}int main(){ int a = 0; func(a); // a = 20}void func(int* px){ *px = 20;}int main(){ int a = 0; func(&a); // a = 20} &(reference)참조 변수 x는 main의 a 변수의 별명이 되어 a의 메모리를 공유하게 된다. 즉, 서로 부르는 이름만 다를 뿐이지 같은 주소를 공유한다. *(pointer)px는 int*로 포인터 타입이다. 해당 타입은 지역변수이자 매개변수이다.참조와 다른 큰 특징은 px는 a와 주소가 다르다는 것이다. *px와 *a가 가르키는 값은 같다. 다만, px와 a의 주소는 다르다는 이야기이다.
·Graphics
참고https://www.yes24.com/Product/Goods/24301920https://learnopengl.com/Advanced-Lighting/SSAOSSAO이름에서 알 수 있듯이, 포스트 프로세싱 과정 중 하나이다. 이전에 Ambient Lighting에 대해서 공부하였고 해당 라이팅은 고정된 빛에서 빛이 산란됨에 따라 장면이 그려지는 것을 표현한 것이다. 간접적인 라이팅의 한 종류를 Ambient occlusion이라고 부른다. 이러한 종류의 간접 라이팅은 서로가 밀접하게 붙어있기 때문에 더 어둡게 보인다는 특징이 있다. Crytek 발표자표2007년에 Crytek에서 발표한 기술로 depth buffer를 screen-space에서 이용해 occlusion의 크기를 결정한다. 이론은 ..
·Graphics
참고https://learnopengl.com/Advanced-Lighting/Deferred-Shadinghttps://www.slideshare.net/slideshow/deferred-shading/1552178?from_search=0#1https://www.slideshare.net/slideshow/ndc11-deferred-shading/8192630?from_search=1https://kyuhwang.tistory.com/4?category=523414#Deferred%EC%-D%--%--%EC%-D%B-%EC%A-%--Deferred Shading보통 사용하는 방식은 Foward Shading방식이다. 해당 방식은 각각의 오브젝트마다 라이팅을 하는 방식으로 라이트의 개수가 늘어날수록 비..
·Graphics
참고https://learnopengl.com/Advanced-Lighting/Normal-Mappinghttps://blog.naver.com/ideugu/221402703960Normal Mapping모든 장면들은 셀 수 없이 많은 삼각형들로 이루어진 meshes이다. 이런 평평한 삼각형 2D Texture에게 생기를 불어주는 것이 해당 기술이다.예를 들어, 벽돌 벽면이 존재한다고 한다면 빛은 벽돌 사이의 작은 크랙들을 인식하지 못한다. 왜냐하면, 표면의 normal vectors가 수직(perpendicular)적이기 때문이다.위의 사진들을 비교하면 확연한 차이가 나타나는 것을 확인할 수 있다. 노말 맵을 적용하기 위해서는 한 가지 Resource가 필요하다. DirectX형태의 자료는 Y값을 반전..
·D3D11
구성요소물체를 그리기 위해서는 필요한 것은 vertices, indices, normals라는 기본적인 3개의 구성요소이다.해당 요소를 쉽게 정리하기 위해서 MeshData, Mesh라는 클래스를 정의하였다.Mesh해당 클래스의 경우에는 물체를 그리기 위해 필요한 buffer들을 담아두는 역할을 한다. 우리가 만드는 도형에다가 텍스쳐 이미지를 사용할 수 있으므로, 이에 대비해 texture2D와 SRV를 정의한다.struct Mesh { // Mesh Constant // uint16_t Material Constant (materialCBV) // PSO ComPtr vertexBuffer; ComPtr indexBuffer; ComPtr vertexConstBuffe..
·Graphics
참고https://learnopengl.com/Advanced-Lighting/Shadows/Point-Shadowshttps://www.gamedev.net/forums/topic/659535-cubemap-texture-as-depth-buffer-shadowmapping/https://gamedev.net/forums/topic/674787-cubemap-depth-sample/5271471/ 지난 번에 만들었던 Shadow Mapping 기술의 그림자는 directional lights에 적합한 기술이었다. 왜냐하면 그림자가 오직 light가 진행하는 방향에서만 발생하기 때문이었다. 그 이유는 빛의 시점을 이용해서 그림자를 그렸기 때문이다.Point Shadows해당 기술은 지난번 만들었던 것과 ..
·Graphics
참고https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-MappingShadow Mapping기본적으로, 그림자는 occlusion으로 인한 빛의 부재로 인해 그림자가 발생하게 된다.![[빛의 시점에서 렌더링.png]]실시간 렌더링 환경에서 그림자를 그리는 아이디어는 빛의 시점에서 렌더링을 하는 것이다. 이러한 방법으로 수천 개의 빛 광선을 그리는 것은 극도로 비효율적인 접근이다. 실시간 렌더링에서는 부적합한 방법이다.그래서 빛 광선에서의 시점을 그대로 그리는 대신에 유사한 방법으로 depth buffer를 이용할 것이다. 이것을 shadow map이라고도 부른다. 빛의 시점에서 depth buffer를 그리는 것이다.depth value를 이용해서 가장..
·Graphics
참고https://opengl-notes.readthedocs.io/en/latest/topics/texturing/aliasing.htmlhttps://learnopengl.com/Advanced-OpenGL/Depth-testing홍정모 - 그래픽스 Part3 강의Depth BufferDepth buffer는 D3D11의 경우에는, DepthStencilBuffer를 통해서 만들어진다. 해당 버퍼를 통해서 16, 24 또는 32 bit floats로 구성할 수 있다. 대게 Depth buffer 24bit, Stencil buffer 8 bit를 할당한다.Depth란 결국 '화면에 그려지는 친구들'의 깊이 축(z-coordinate)이다. 화면에 그려진다는 것은 View Frustum 안에 들어와 있..
·C++
Virtual이란 무엇인가?Virtual의 정의는 '가상의' 이라는 의미를 포함한다. 부모를 상속받은 자식 클래스에서 재정의 할 것으로 기대하고 정해놓은 함수라고 이야기한다.그렇다면, 가상함수로 정의한것과 정의하지 않은 것은 명확한 차이를 보일까?컴파일러는 함수를 호출할 때 매우 복잡한 과정을 거치게 됩니다. 그렇기에 컴파일러는 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환시킵니다. 이것을 정적바인딩이라고 합니다.하지만 일반 함수를 오버 로딩하게 되면 정적바인딩으로 인해 문제가 될 수 있습니다. 가상함수가 아닌 보통의 경우 부모 클래스형 포인터로 멤버 함수를 호출할때, 컴파일러는 정적타입을 보고 이 타입에 맞는 멤버함수를 호출하기 때문입니다.정적바인딩으로 인해(컴파일 당시 호출될 함수의..
·C++
C++에서 &을 이용하여 참조로 전달할 수 있다. 이렇게 되면 데이터를 복사하는 것이 아닌 해당 메모리에 있는 데이터를 그대로 사용하게 된다.참조로 전달하는 것이 재미있는 것은 포인터가 하지 못하는 것을 할 수 있다는 것이다. 포인터를 통해서 주소를 전달하는 것도 데이터 복사를 하지 않는다. 왜냐하면 주소 자체를 전달하는 것이므로 함수에서는 주소를 접근하기 때문이다.하지만, 함수 내에서 해당 주소를 변경하게 되면 기존 파라미터로 전달한 주소는 변경되지 않는다는 점이다.  기존에 한 주소에 두 개의 포인터가 연결되었는데, 그 중 한 포인터가 새로운 주소에 연결되었다고 이해하면 된다.이렇기 때문에 참조가 필요하다. 주소를 전달해서 원본 주소도 변경하고 싶을 때에는 포인터를 참조로 전달하면 되기 때문이다.#i..
Koala Jung
'분류 전체보기' 카테고리의 글 목록 (2 Page)