분류 전체보기
7. CRTP, Static Plymophism and Rebind
후... 연말, 연초에는 안바쁠거라고 하던 회사는 거짓말쟁이다. 야근밖에 안했다.. ㅠㅠ CRTP(Curiously Recurring Template Pattern) - 기반 클래스에서 파생 클래스의 이름을 사용할 수 있게 하는 기법 - 파생 클래스를 만들 때 기반 클래스의 템플릿 인자로 파생 클래스 이름을 전달. 이름부터 이상한 반복 템플릿 패턴이다. 어떻게 사용되는지 3개의 예시로 보자 Counter template struct counter { static int objects_created; static int objects_alive; counter() { ++objects_created; ++objects_alive; } protected: ~counter() { --objects_alive;..
6. STL Placement new
C++ STL 중 vector에 값을 넣고 뺄때 push_back을 사용해서 넣는다. 이렇게 넣을때, vector 내부에서는 연결돼있는 배열에 값을 넣고 만약 그 크기가 다 차게 되면 더 많은 메모리를 재 할당하여 사용하게 된다. 만약, 여기서 값을 빼고 해제를 하고싶어 delete를 사용해서 중간에 있는 값을 해제하게 되면!?!???! 연결돼있는 배열에서 중간의 값이 빠지면서 메모리가 큰일 날것이다.(안해봐서 모르는데 위험해보이긴 한다. 맨 처음값이 배열의 크기를 담당하는데 연속되는 중간에 값이 없으니까) 간단히 알아보자 #include #include #include char buffer[1024]; class KTest { unsigned int _iData; public: KTest() { _iD..
5. Operator Overloading03 operator new
32비트 환경이다. 간단한 클래스 부터 보자 #include int buffer[1024] = {0}; class KTest { public: KTest() { printf("KTest()\r\n"); } ~KTest() { printf("~KTest()\r\n"); } private: int i = 3; }; void main() { KTest* p; p = new KTest; delete p; } 출력 : KTest() ~KTest() 생성자 소멸자를 호출하는 간단한 생성자이다. C++ 클래스에서 생성자를 호출하여 동적으로 할당할 때 메모리 할당(new) -> 생성자 호출(KTest()) 그리고 해제 할때는 소멸자 호출(~KTest()) -> 메모리 해제(delete) 이런 순서로 작동한다. 메모리를..
4. Operator Overloading Ostream
이번에는 C++에서 흔히 사용하는 std::cout을 만들어보자 class ostream { public: const ostream& Print(const int i) const { printf("%i", i); return *this; } const ostream& Print(const float f) const { printf("%f", f); return *this; } const ostream& Print(const char* s) const { printf("%s", s); return *this; } }; 이런식으로 정의하게 되면 ostream cout; int main() { int i = 3; float f = 4.1f; cout.Print(i).Print(f).Print("Hello");..
3. Operator Overloading Function
C++이나 C#에서 string을 정의 및 연산을 할때 사용하는 명령어를 간단하게 만들어 보자. 보통 문자열 데이터를 선언할 때 string s = "hello"; 이런식으로 선언 할 것이다. 이렇게 선언하는 방법을 만들어보자. class string { public: string(const char* s = nullptr) { if (s == nullptr) { buffer[0] = NULL; } else { strcpy_s(buffer, s); } } const char* c_str() const { return buffer; } private: char buffer[100]; }; (임시로 문자열 최대 크기는 100으로 잡아놨다.) 이런식으로 선언 한다. 이렇게 하고 위의 명령어를 실행 하면 hel..

9. 정반사광
정반사광은 밝은 점광원의 위치가 어디인지 알려주는 단서의 역할을 합니다. 예를들어 단순조명과 주변광이 적용된 시뻘건 구체가 있다면 다음과 같을 것입니다. 여기에 하얀 정반사광 효과를 넣어주면 다음과 같아질겁니다. 정반사광은 거울이나 반짝반짝한 금속 표면과 같은 재밀에서의 빛의 반사를 표현하는 거의 모든 경우에 사용됩니다. 또한 태양빛이 물에 반사괴는덧도 같은 다른 재질도 이것으로 표현이 가능합니다. 잘만 사용된다면, 3D장면의 리얼리티 수준을 한층 더 끌어올려 줄 수 있습니다. (레이트레이싱 기술만 봐도 빛 연산을 엄청나게 끌어올린 기술인데 현실과 비슷해진다.) 정반사광의 방적식은 다음과 같습니다. 반사광 = 반사색 * (반사된 빛의 색 * ((법선과 하프벡터의 내적) ^ 반사강도) * 감쇄계수 * 스포..

8. 주변광
주변광은 특정한 방향이 없이 주변을 덮고 있는 빛을 말합니다. 물론 광원은 있지만, 여러가지 요소들에 부딪히고 반사되어 점차 방향을 잃어버린 빛의 현태에 해당합니다. 따라서 이러한 조명은 물체의 어떤 면에나 비춰지며, 지금까지 살펴본 예제에서와 같이 어느쪽으로 회전하던간에 일정한 밝기와 색상으로 표현되는 경우가 바로 이 주변광의 영향을 받은 것입니다. 주변광을 흉내내기 위해서 간단한 방정식을 사용할 것입니다. 단지 픽셀 셰이더에서 맨처음 각 픽셀마다 일정 수준의 주변광에 해당하는 값을 줍니다. 드 귀에 이루어지는 모든 연산들은 단지 그 주변광 값에 계산된 값들을 더하는 것입니다. 이렇게 하여 아무리 어두운 곳이더라도 최소한 주변광 만큼의 색상을 가지게 할 수 있습니다. LightPixelShader에 확..

7. Maya 2011 모델 불러오기
마야 프로그램에서 모델을 불러와야 하지만, 없기 때문에 불러오는 법은 생략 하겠습니다. ㅎㅎ;; Cube.obj # This file uses centimeters as units for non-parametric coordinates. mtllib cube.mtl g default v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.50..