게임 개발/그래픽스
-
회전 주의 Transpose를 하면 -Sin theta가 왼쪽 아래에 온다. 이동 1을 더 붙였다! -> 이동 됨. 0을 붙이면? -> 이동 안됨. 즉, 일반 벡터면 0 붙이고, point 좌표이면 1을 붙인다. (차원 추가) 이런 방식을 Homogeneous Coordinates (동차좌표계)라고 부른다. Homogeneous Coordinates (동차좌표계) 벡터/포인트의 회전과 이동을 하나의 행렬로 표현 가능하다! 엄청 편하다!
변환 (Transformations)회전 주의 Transpose를 하면 -Sin theta가 왼쪽 아래에 온다. 이동 1을 더 붙였다! -> 이동 됨. 0을 붙이면? -> 이동 안됨. 즉, 일반 벡터면 0 붙이고, point 좌표이면 1을 붙인다. (차원 추가) 이런 방식을 Homogeneous Coordinates (동차좌표계)라고 부른다. Homogeneous Coordinates (동차좌표계) 벡터/포인트의 회전과 이동을 하나의 행렬로 표현 가능하다! 엄청 편하다!
2023.11.17 -
핵심 어떤 벡터를 이동, 회전, 스케일링 등등 Transformation 을 가하고 싶으면, 그 벡터에 행렬을 곱하면 된다. 행렬 표기법 row, column 행, 열 그림에서 행렬 B는 3x2 행렬 directX 에서는 u와 같은 row vector를 선호 Row Vector Column Vector 행렬 더하기 주의: 크기가 다른 행렬끼리는 더할 수 없다. 예) C+D=? 불가능 컴퓨터에게 연산을 시킬때, r(A+B)라고 계산을 시키는 쪽이 rA+rB 계산 시키는 쪽 보다 빠를것이다. r(A+B): 덧셈4번, 곱셈4번 rA+rB: 덧셈4번, 곱셈8번 같은 이유로 (r+s)A 가 rA + sA보다 더 빠름 행렬 곱하기 행렬끼리도 크기가 맞아야 한다. 예를들어 다음과 같은 AB의 곱셈은 불가. AB와 B..
행렬핵심 어떤 벡터를 이동, 회전, 스케일링 등등 Transformation 을 가하고 싶으면, 그 벡터에 행렬을 곱하면 된다. 행렬 표기법 row, column 행, 열 그림에서 행렬 B는 3x2 행렬 directX 에서는 u와 같은 row vector를 선호 Row Vector Column Vector 행렬 더하기 주의: 크기가 다른 행렬끼리는 더할 수 없다. 예) C+D=? 불가능 컴퓨터에게 연산을 시킬때, r(A+B)라고 계산을 시키는 쪽이 rA+rB 계산 시키는 쪽 보다 빠를것이다. r(A+B): 덧셈4번, 곱셈4번 rA+rB: 덧셈4번, 곱셈8번 같은 이유로 (r+s)A 가 rA + sA보다 더 빠름 행렬 곱하기 행렬끼리도 크기가 맞아야 한다. 예를들어 다음과 같은 AB의 곱셈은 불가. AB와 B..
2023.11.17 -
벡터는 굵은 소문자, 행렬은 굵은 대문자 사용. 벡터 벡터는 방향과 크기 (direction and magnitude) 두 벡터의 방향과 길이가 같으면 같은 벡터 벡터는 위치 무관 변위(displacements) 시작점과 상관없이 미는 정도(u). 이동을 벡터를 사용해서 표현할 수 있다. 좌표계에서 벡터의 좌표 벡터를 좌표계에 표현가능 벡터의 표준 위치 벡터의 꼬리를 0,0(원점)에 놓으면 표준위치. 좌표계 왼손 좌표계 vs 오른손 좌표계 DirectX, Unreal Engine 등은 왼손좌표계를 사용. Opengl, Vulkan, 컴퓨터 비전 쪽 등은 오른손 좌표계 사용. 통일되지 않았음. 기본적인 벡터 연산 벡터의 길이 단위 벡터(unit vector) 내적 (Dot Product) Orthogona..
벡터벡터는 굵은 소문자, 행렬은 굵은 대문자 사용. 벡터 벡터는 방향과 크기 (direction and magnitude) 두 벡터의 방향과 길이가 같으면 같은 벡터 벡터는 위치 무관 변위(displacements) 시작점과 상관없이 미는 정도(u). 이동을 벡터를 사용해서 표현할 수 있다. 좌표계에서 벡터의 좌표 벡터를 좌표계에 표현가능 벡터의 표준 위치 벡터의 꼬리를 0,0(원점)에 놓으면 표준위치. 좌표계 왼손 좌표계 vs 오른손 좌표계 DirectX, Unreal Engine 등은 왼손좌표계를 사용. Opengl, Vulkan, 컴퓨터 비전 쪽 등은 오른손 좌표계 사용. 통일되지 않았음. 기본적인 벡터 연산 벡터의 길이 단위 벡터(unit vector) 내적 (Dot Product) Orthogona..
2023.11.12 -
조명의 세 가지 종류 조명으로부터 멀어지면 점점 어두워지는 것을 어떻게 구현? 정확한 물리 계산을 하면 너무 느림 falloffStart falloffEnd 이 두 가지를 이용한다. Spot Lights 중심에서 멀 수록 빛이 약해야 한다. 중심에 가까울수록 빛이 강해야 한다. vec3 ComputeSpotLight(Light L, Material mat, vec3 pos, vec3 normal, vec3 toEye) { vec3 lightVec = L.position - pos; // 쉐이딩할 지점부터 조명까지의 거리 계산 float d = length(lightVec); // 너무 멀면 조명이 적용되지 않음 if (d > L.fallOffEnd) return vec3(0.0f); lightVec /=..
조명조명의 세 가지 종류 조명으로부터 멀어지면 점점 어두워지는 것을 어떻게 구현? 정확한 물리 계산을 하면 너무 느림 falloffStart falloffEnd 이 두 가지를 이용한다. Spot Lights 중심에서 멀 수록 빛이 약해야 한다. 중심에 가까울수록 빛이 강해야 한다. vec3 ComputeSpotLight(Light L, Material mat, vec3 pos, vec3 normal, vec3 toEye) { vec3 lightVec = L.position - pos; // 쉐이딩할 지점부터 조명까지의 거리 계산 float d = length(lightVec); // 너무 멀면 조명이 적용되지 않음 if (d > L.fallOffEnd) return vec3(0.0f); lightVec /=..
2023.11.11 -
vec4 MyPixelShader(const PSInput psInput) { vec3 eye = vec3(0.0f, 0.0f, -1.0f); vec3 toEye = glm::normalize(eye - psInput.position); vec3 color = ComputeDirectionalLight(constants.light, constants.material, psInput.normal, toEye); return vec4(color, 1.0f); } 쉐이딩을 어디서 하는 것이 좋을까? vertex shader? pixel shader? vertex shader는 pixel shader 보다 처리해야할 계산 수가 훨씬 적다. 따라서 계산이 빠를것이다. 그러나 퀄리티는 떨어질 것이다. 요즘 GPU는..
블린-퐁 쉐이딩 (Blinn-Phong Shading)vec4 MyPixelShader(const PSInput psInput) { vec3 eye = vec3(0.0f, 0.0f, -1.0f); vec3 toEye = glm::normalize(eye - psInput.position); vec3 color = ComputeDirectionalLight(constants.light, constants.material, psInput.normal, toEye); return vec4(color, 1.0f); } 쉐이딩을 어디서 하는 것이 좋을까? vertex shader? pixel shader? vertex shader는 pixel shader 보다 처리해야할 계산 수가 훨씬 적다. 따라서 계산이 빠를것이다. 그러나 퀄리티는 떨어질 것이다. 요즘 GPU는..
2023.11.10 -
이전 ray tracing 기법에서 했던대로 곧이 곧대로 구현하기만 하면, 왜곡이 일어난다. 이를 수정하는 방법을 배우고, 또한 우리의 눈의 위치와 물체의 위치와의 거리에 따라 보이는게 달라진다. 예를 들어 물체와 가까워질수록 기울어진 각도등이 과장돼서 보이고, 멀어질수록 평면적으로 보인다. Z축은 투영되니까 그냥 0이 되고, Y축은 그림처럼 삼각형의 닮음을 이용한 비례식으로 구할 수 있다. X축도 마찬가지로 위에서 봤을때라고 생각하면 Y와 마찬가지로 구할 수 있다. 이것만 가지고 구하면 다음처럼 왜곡된 형태가 나온다. // 원근투영(Perspective projection) if (this->usePerspectiveProjection) { // ... const float scale = distEye..
원근 투영 (Perspective Projection)이전 ray tracing 기법에서 했던대로 곧이 곧대로 구현하기만 하면, 왜곡이 일어난다. 이를 수정하는 방법을 배우고, 또한 우리의 눈의 위치와 물체의 위치와의 거리에 따라 보이는게 달라진다. 예를 들어 물체와 가까워질수록 기울어진 각도등이 과장돼서 보이고, 멀어질수록 평면적으로 보인다. Z축은 투영되니까 그냥 0이 되고, Y축은 그림처럼 삼각형의 닮음을 이용한 비례식으로 구할 수 있다. X축도 마찬가지로 위에서 봤을때라고 생각하면 Y와 마찬가지로 구할 수 있다. 이것만 가지고 구하면 다음처럼 왜곡된 형태가 나온다. // 원근투영(Perspective projection) if (this->usePerspectiveProjection) { // ... const float scale = distEye..
2023.11.10