전체 글
-
삼각형 두개로 사각형 그리기 class Square : public Object { public: Triangle triangle1, triangle2; Square(vec3 v0, vec3 v1, vec3 v2, vec3 v3) : triangle1(v0, v1, v2), triangle2(v0, v2, v3) { } virtual Hit CheckRayCollision(Ray &ray) { auto hit1 = triangle1.CheckRayCollision(ray); auto hit2 = triangle2.CheckRayCollision(ray); if (hit1.d >= 0.0f && hit2.d >= 0.0f) { return hit1.d < hit2.d ? hit1 : hit2; } else..
[그래픽스] 그림자삼각형 두개로 사각형 그리기 class Square : public Object { public: Triangle triangle1, triangle2; Square(vec3 v0, vec3 v1, vec3 v2, vec3 v3) : triangle1(v0, v1, v2), triangle2(v0, v2, v3) { } virtual Hit CheckRayCollision(Ray &ray) { auto hit1 = triangle1.CheckRayCollision(ray); auto hit2 = triangle2.CheckRayCollision(ray); if (hit1.d >= 0.0f && hit2.d >= 0.0f) { return hit1.d < hit2.d ? hit1 : hit2; } else..
2023.10.28 -
이전까지는 구의 방정식을 이용해 구를 그렸다. 컴퓨터는 삼각형 여려개를 모아서 삼각형 메시(Triangle Mesh)로 물체를 그려낼 수 있다. 그래픽카드의 성능은 이 삼각형을 얼마나 빠르게 처리할 수 있느냐가 하나의 성능의 기준이 된다. [주의] 레이 트레이싱에서 삼각형을 그리는 방법과 리얼타임 렌더링 파이프라인에서 삼각형을 그리는 방법은 다르다. 이번에 다룰것은 레이 트레이싱에서 삼각형을 다루는 방법이다. 삼각형 삼각형은 세개의 점이 주어지면 반드시 한 평면으로 정의된다. 사각형의 경우에는 임의의 4개의 점으로 반드시 한 평면으로 정의된다고 할 수 없다. 한 점, 즉 한 정점을 Vertex라고 부른다. 어떻게 그리냐? 시점(눈)위치에서 ray를 쏜다. 3개의 점으로 정의되는 평면과 충돌하는 지점을 찾..
[그래픽스] 삼각형과 광선의 충돌이전까지는 구의 방정식을 이용해 구를 그렸다. 컴퓨터는 삼각형 여려개를 모아서 삼각형 메시(Triangle Mesh)로 물체를 그려낼 수 있다. 그래픽카드의 성능은 이 삼각형을 얼마나 빠르게 처리할 수 있느냐가 하나의 성능의 기준이 된다. [주의] 레이 트레이싱에서 삼각형을 그리는 방법과 리얼타임 렌더링 파이프라인에서 삼각형을 그리는 방법은 다르다. 이번에 다룰것은 레이 트레이싱에서 삼각형을 다루는 방법이다. 삼각형 삼각형은 세개의 점이 주어지면 반드시 한 평면으로 정의된다. 사각형의 경우에는 임의의 4개의 점으로 반드시 한 평면으로 정의된다고 할 수 없다. 한 점, 즉 한 정점을 Vertex라고 부른다. 어떻게 그리냐? 시점(눈)위치에서 ray를 쏜다. 3개의 점으로 정의되는 평면과 충돌하는 지점을 찾..
2023.10.28 -
Orthographic projection (정투영) 화면에서 모든 픽셀에서 모든 광선을 (0, 0, 1) 방향으로 쏘는 것 void Render(std::vector& pixels) { std::fill(pixels.begin(), pixels.end(), vec4{ 0.0f, 0.0f, 0.0f, 1.0f }); const vec3 eyePos(0.0f, 0.0f, -1.5f); #pragma omp parallel for for (int j = 0; j < height; j++) for (int i = 0; i < width; i++) { const vec3 pixelPosWorld = TransformScreenToWorld(vec2(i, j)); // 광선의 방향 벡터 // 스크린에 수직인 z방..
[그래픽스] Orthographic projection (정투영) vs perspective projection (원근투영)Orthographic projection (정투영) 화면에서 모든 픽셀에서 모든 광선을 (0, 0, 1) 방향으로 쏘는 것 void Render(std::vector& pixels) { std::fill(pixels.begin(), pixels.end(), vec4{ 0.0f, 0.0f, 0.0f, 1.0f }); const vec3 eyePos(0.0f, 0.0f, -1.5f); #pragma omp parallel for for (int j = 0; j < height; j++) for (int i = 0; i < width; i++) { const vec3 pixelPosWorld = TransformScreenToWorld(vec2(i, j)); // 광선의 방향 벡터 // 스크린에 수직인 z방..
2023.10.28 -
https://en.wikipedia.org/wiki/Phong_reflection_model Phong reflection model - Wikipedia From Wikipedia, the free encyclopedia Shading algorithm in computer graphics The Phong reflection model (also called Phong illumination or Phong lighting) is an empirical model of the local illumination of points on a surface designed by the computer graph en.wikipedia.org Ambient -> 색 그 자체 Diffuse -> 물체의 표면이..
[그래픽스] Phong Relfection Model 구와 조명 효과https://en.wikipedia.org/wiki/Phong_reflection_model Phong reflection model - Wikipedia From Wikipedia, the free encyclopedia Shading algorithm in computer graphics The Phong reflection model (also called Phong illumination or Phong lighting) is an empirical model of the local illumination of points on a surface designed by the computer graph en.wikipedia.org Ambient -> 색 그 자체 Diffuse -> 물체의 표면이..
2023.10.28 -
참고자료: https://en.wikipedia.org/wiki/Line%E2%80%93sphere_intersection 구의 식과 직선의 식을 d에 대해서 풀면 구와 직선의 intersection에 대해 구할 수 있다. 두 식을 연립방정식의 해를 구하듯이 구할 수 있다. 식을 정리하면 2차 방정식같은 형태가 나오고, 이를 근의 공식으로 구한다. ∇나블라(nabla) 를 구한다음 이를 이용해, d를 구한다. ∇>0: 만나는 점이 2개, +- 에 대해 모두 각각 따로 구해야 한다. ∇==0: 만나는 점이 1개 ∇ d값이 2개라면 작은 값을 선택하면 된다(가까운 쪽에 먼저 닿을거고, 먼쪽은 가까운쪽을 뚫고 나올때 부딪히는 부분일테니까) class Sphere { public: glm::vec3 center..
[그래픽스] Line-sphere Intersection 을 이용해 3차원 구 그리기참고자료: https://en.wikipedia.org/wiki/Line%E2%80%93sphere_intersection 구의 식과 직선의 식을 d에 대해서 풀면 구와 직선의 intersection에 대해 구할 수 있다. 두 식을 연립방정식의 해를 구하듯이 구할 수 있다. 식을 정리하면 2차 방정식같은 형태가 나오고, 이를 근의 공식으로 구한다. ∇나블라(nabla) 를 구한다음 이를 이용해, d를 구한다. ∇>0: 만나는 점이 2개, +- 에 대해 모두 각각 따로 구해야 한다. ∇==0: 만나는 점이 1개 ∇ d값이 2개라면 작은 값을 선택하면 된다(가까운 쪽에 먼저 닿을거고, 먼쪽은 가까운쪽을 뚫고 나올때 부딪히는 부분일테니까) class Sphere { public: glm::vec3 center..
2023.10.28 -
#include 로 .h 헤더 파일을 넣음. -> 통째로 복사해서 긁어오는 방식. 꼭 필요한 것만 넣는게 좋음. #pragma once: 실수로 같은 내용이 두번 들어갈 수 있는데, 한번만 들어가게 해 주는 키워드. 컴파일러에서 지원하는 것. #ifndef, #define, #endif 를 사용하는 방식도 있음. 얘는 언어에서 지원하는 방법.
파일 분할 관리#include 로 .h 헤더 파일을 넣음. -> 통째로 복사해서 긁어오는 방식. 꼭 필요한 것만 넣는게 좋음. #pragma once: 실수로 같은 내용이 두번 들어갈 수 있는데, 한번만 들어가게 해 주는 키워드. 컴파일러에서 지원하는 것. #ifndef, #define, #endif 를 사용하는 방식도 있음. 얘는 언어에서 지원하는 방법.
2023.10.27 -
#include using namespace std; #include const int MAX = 1000; int board[MAX][MAX] = {0, }; int N; void PrintBoard() { int digit = 0; int temp = N*N; while (temp > 0) { temp /= 10; digit++; } for (int i = 0; i < N; i++) { cout
[언리얼 MMORPG pt1] 달팽이 문제#include using namespace std; #include const int MAX = 1000; int board[MAX][MAX] = {0, }; int N; void PrintBoard() { int digit = 0; int temp = N*N; while (temp > 0) { temp /= 10; digit++; } for (int i = 0; i < N; i++) { cout
2023.10.27 -
#include using namespace std; void ReverseStr(char* str) { int len = strlen(str); for (int i = 0; i < len/2; i++) { swap(str[i], str[len - i - 1]); } } void StrCat(char* dst, char* src) { int len = strlen(src); int lenDst = strlen(dst); for (int i = 0; i < len; i++) { *(dst + len + i) = src[i]; } } int StrCmp(char* str1, char* str2) { while (*str1 != '\0' || *str2 != '\0') { if (*str1 < *str2) {..
[언리얼 MMORPG pt1] 문자열 함수 구현#include using namespace std; void ReverseStr(char* str) { int len = strlen(str); for (int i = 0; i < len/2; i++) { swap(str[i], str[len - i - 1]); } } void StrCat(char* dst, char* src) { int len = strlen(src); int lenDst = strlen(dst); for (int i = 0; i < len; i++) { *(dst + len + i) = src[i]; } } int StrCmp(char* str1, char* str2) { while (*str1 != '\0' || *str2 != '\0') { if (*str1 < *str2) {..
2023.10.27 -
#include using namespace std; // 오늘의 주제: 포인터 마무리 // 1) 포인터 vs 배열 2탄 // 2) 주의사항 (마음가짐?) // 절대 이런 함수를 만들지 마 int& Test() { int a = 0; // 지역 변수를 반환? // 지역 변수는 함수가 끝나면 사라짐 return a; } // 절대 이런 함수를 만들지 마2 int* Test2() { int a = 0; // 지역 변수를 반환? // 지역 변수는 함수가 끝나면 사라짐 return &a; } int main() { // ==포인터== // 주소를 담는 바구니 // 진퉁은 저~ 멀리 어딘가에 있음 // p는 단지 그 곳으로 워프하는 포탈 int* p; // ==배열== // 진짜배기! 원조 데이터 // 닭장처럼 ..
[언리얼 MMORPG pt1] 포인터 마무리#include using namespace std; // 오늘의 주제: 포인터 마무리 // 1) 포인터 vs 배열 2탄 // 2) 주의사항 (마음가짐?) // 절대 이런 함수를 만들지 마 int& Test() { int a = 0; // 지역 변수를 반환? // 지역 변수는 함수가 끝나면 사라짐 return a; } // 절대 이런 함수를 만들지 마2 int* Test2() { int a = 0; // 지역 변수를 반환? // 지역 변수는 함수가 끝나면 사라짐 return &a; } int main() { // ==포인터== // 주소를 담는 바구니 // 진퉁은 저~ 멀리 어딘가에 있음 // p는 단지 그 곳으로 워프하는 포탈 int* p; // ==배열== // 진짜배기! 원조 데이터 // 닭장처럼 ..
2023.10.27 -
#include using namespace std; // 오늘의 주제: 다차원 배열 int main() { int a[10] = { 1, 2, 3 }; int first[5] = { 4, 2, 3, 4, 1 }; int second[5] = { 1, 1, 5, 2, 2 }; int apartment2D[2][5] = { { 4, 2, 3, 4, 1 }, { 1, 1, 5, 2, 2 } }; // 인덱스 이용 for (int floor = 0; floor < 2; floor++) { for (int room = 0; room < 5; room++) { cout
[언리얼 MMORPG pt1] 다차원 배열#include using namespace std; // 오늘의 주제: 다차원 배열 int main() { int a[10] = { 1, 2, 3 }; int first[5] = { 4, 2, 3, 4, 1 }; int second[5] = { 1, 1, 5, 2, 2 }; int apartment2D[2][5] = { { 4, 2, 3, 4, 1 }, { 1, 1, 5, 2, 2 } }; // 인덱스 이용 for (int floor = 0; floor < 2; floor++) { for (int room = 0; room < 5; room++) { cout
2023.10.27