게임 개발
-
조명의 세 가지 종류 조명으로부터 멀어지면 점점 어두워지는 것을 어떻게 구현? 정확한 물리 계산을 하면 너무 느림 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 -
화면에 보이는 부분만 그리면 성능적인 이득을 볼 수 있다. 이것을 backface culling이라고 한다. 비슷하게 occlusion(다른 물체에 가리는 것)을 그리지 않는 culling 방식도 있다. 화면에 projection된 vertex의 위치가 시계방향(왼손좌표계 기준)이면 앞면, 반시계 방향이면 뒷면이라고 판단한다. 그렇다면 애초에 vertex를 저렇게 시계방향으로 잘 순서대로 잘 배치해주는 건 어떻게 작동되는거냐? -> 그건 모델링 소프트웨어에서 지원한다. vertex를 화면으로 projection vertex들의 좌표가 screen 좌표계로 변환된다. 월드 좌표계에서는 z방향이 화면 안으로 들어가는 방향이었다. 반대로 screen 좌표계에서는 우리쪽으로 오는 방향이다. 이때 삼각형이 앞면인..
뒷면 제거 (backface culling)화면에 보이는 부분만 그리면 성능적인 이득을 볼 수 있다. 이것을 backface culling이라고 한다. 비슷하게 occlusion(다른 물체에 가리는 것)을 그리지 않는 culling 방식도 있다. 화면에 projection된 vertex의 위치가 시계방향(왼손좌표계 기준)이면 앞면, 반시계 방향이면 뒷면이라고 판단한다. 그렇다면 애초에 vertex를 저렇게 시계방향으로 잘 순서대로 잘 배치해주는 건 어떻게 작동되는거냐? -> 그건 모델링 소프트웨어에서 지원한다. vertex를 화면으로 projection vertex들의 좌표가 screen 좌표계로 변환된다. 월드 좌표계에서는 z방향이 화면 안으로 들어가는 방향이었다. 반대로 screen 좌표계에서는 우리쪽으로 오는 방향이다. 이때 삼각형이 앞면인..
2023.11.10 -
DirectX 의 동작 단계(그래픽스 파이프 라인)를 보면... 쉐이더라는 용어가 계속 등장하는 것을 볼 수 있다. 각 스테이지를 부분적으로 모듈처럼 떼서 각각 구현하고 붙이고 할 수 있다. (튜닝이 쉽다) 각 스테이지와 스테이지 사이의 화살표 부분의 디테일한 구현은 실제로는 감추어져 있다. 일단 당분간 집중할 쉐이더는 Vertex Shader, Pixel Shader이다 vertex 쉐이더란 무엇인가? 하나의 프로그램이라고 생각하면 된다. 물체를 이동, 크기 변환, 회전 등을 한다. (물체에 해당하는 vertex 모두에 똑같이 적용됨) 어떠한 정보가 들어오고 어떠한 정보가 나가는가? 를 보면 된다. 예) position, color, uv가 들어오고 나가는 vertex 쉐이더. pixel 쉐이더(fra..
쉐이더 개념DirectX 의 동작 단계(그래픽스 파이프 라인)를 보면... 쉐이더라는 용어가 계속 등장하는 것을 볼 수 있다. 각 스테이지를 부분적으로 모듈처럼 떼서 각각 구현하고 붙이고 할 수 있다. (튜닝이 쉽다) 각 스테이지와 스테이지 사이의 화살표 부분의 디테일한 구현은 실제로는 감추어져 있다. 일단 당분간 집중할 쉐이더는 Vertex Shader, Pixel Shader이다 vertex 쉐이더란 무엇인가? 하나의 프로그램이라고 생각하면 된다. 물체를 이동, 크기 변환, 회전 등을 한다. (물체에 해당하는 vertex 모두에 똑같이 적용됨) 어떠한 정보가 들어오고 어떠한 정보가 나가는가? 를 보면 된다. 예) position, color, uv가 들어오고 나가는 vertex 쉐이더. pixel 쉐이더(fra..
2023.11.08 -
여러 물체가 겹쳐 있을때 뭘 위에 그릴까? depth buffer 라는 것을 만들어서 depth가 얕은것만 그리면 된다. https://knowww.eu/nodes/59b8e93cd54a862e9d7e4165 Depth buffer (z-buffer) Description The depth buffer is used to determine visibility, that is, which primitives in the scene are visible to the camera, and which are occluded by other primitives. This is an example of hidden surface removal. The depth buffer, or z-buffer, is si kn..
깊이 버퍼 (Depth buffer / z-buffer)여러 물체가 겹쳐 있을때 뭘 위에 그릴까? depth buffer 라는 것을 만들어서 depth가 얕은것만 그리면 된다. https://knowww.eu/nodes/59b8e93cd54a862e9d7e4165 Depth buffer (z-buffer) Description The depth buffer is used to determine visibility, that is, which primitives in the scene are visible to the camera, and which are occluded by other primitives. This is an example of hidden surface removal. The depth buffer, or z-buffer, is si kn..
2023.11.07