일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 개인 바이트
- Virtual Byte
- 가상 바이트
- C언어
- VR
- Specular
- Cell Shader
- AppSW
- 벡터
- 메모리 누수
- Private Bytes
- 3d
- Cell Look
- 게임 수학
- Cartoon Rendering
- OculusMotionVectorPass
- Toon Shader
- ColorGradingLutPass
- ASW(Application SpaceWarp)
- URP로 변경
- URP
- 작업 집합
- working set
- Windows Build
- 프로그래밍 기초
- Rim Light
- Three(Two) Tone Shading
- Today
- Total
목록게임 프로그래밍(학습 내용 정리)/게임 수학 (33)
WinCNT
Cartoon Rendering와 원리가 비슷하다 Cartoon Rendering은 명암 값(N dot L)의 값을 불연속으로 바꾸는 것이라면 Pixelate는 UV 텍스처 좌표를 불연속 값으로 바꾸는 것이다 (0.0 ~ 1.0 사이의 UV텍스처 좌표를 불연속(discontinuous) 값으로 바꿈) 실제로 적용할 식은 round(x * 16) / 16(x = 0 to 1) 위와 같은 함수를 적용하면 16픽셀의 이미지로 바뀌게 된다 Pixelate Code float4 Pixelate( sampler2D s, float2 uv ) { uv = round( uv * _PixelSize ) / _PixelSize; // round()외에 ceil()이나 floor()를 써서 테스트 해보자 return tex..
Bloom 빛이 Blooding하는 느낌 Blur 효과를 사용한다 Bloom을 위해서는 우선 밝은 부분을 Bloom Curve 추출해야 한다 (1.2와 같은 파마리터 수치는 알아서 설정) //#define BLOOMCURVE_METHOD_1 //#define BLOOMCURVE_METHOD_2 #define BLOOMCURVE_METHOD_3 float GetBloomCurve( float x, float threshold ) { float result = x; x *= 2.0f; #ifdef BLOOMCURVE_METHOD_1 result = x*0.05+max(0,x-threshold)*0.5; // default threshold = 1.26 #endif #ifdef BLOOMCURVE_METHOD..
Radial Blur과 비슷하면서 다른 Motion Blur Motion Blur의 종류 Full Scene Motion Blur : 카메라가 운동(이동, 회전)할 때 발생 Object Motion Blur : 카메라는 고정, 오브젝트가 운동할 때 발생 Full Scene Motion Blur보다 Object Motion Blur는 조금 만들기가 까다롭다 Full Scene Motion Blur의 원리 1, 2번 보충 Depth는 미리 보관해 둔다 Depth가 있으면 3차원 공간 상에 어디에 있는지 구할 수 있음 텍스처 좌표를 투영 좌표계의 x, y로 바꾸고, 거기에 깊이 값에서 z를 가져오면 투영 좌표계에서의 버텍스의 좌표가 나온다 직전 프레임의 View, Projection 행렬을 가지고 있는다 (사..
집중선과 같은 효과를 주는 Post Processing 기법 중 하나 액션 게임, 레이싱 게임 등에 자주 사용된다 Center로 향하는 Direction 벡터를 구한 뒤 정규화 원본 값과 누적된 값를 가중치로 선형 보간한다 SSS
Post Processing : 실시간 이미지 보정 Post Processing의 한계 이미지 왜곡은 불가능하다 Warping, Morphy 등 Morphy는 캐릭터 표정 변화에 사용하기도 한다 (표정 2개를 만들고 버텍스를 보간) Blur(혹은 Bokeh) Bloom 필터를 최초로 잘 만든 사람이 일본인(마사키 카와세)이라 Bokeh라는 용어가 전문 용어로도 사용되고 있다 Blur는 이미지를 흐릿하게 번지게 하는 것 가장 유명한 Blur 알고리즘은 Gaussian Blur이다 Gaussian 분포 함수 Gaussian Blur에 사용되는 함수 2차원 Plot[(E^(-(x^2)/2))/(Sqrt[2Pi]),{x,-4,4}] 3차원 Plot3D[(E^(-(((x^2)+(y^2))/(2*(1.398)^2)..
예전 카툰 렌더링은 Outer Line이 정말 중요하게 여겨졌지만 현재는 딱히 중요하게 여기지 않은 것이 트랜드가 되었다 Cartoon의 3요소 Specular Reflection (Two)Tone Shading Rim Lighting Toon shading의 3가지 방법 1. 전통적인 Texture LUT사용 N dot L을 밝기 값으로 사용하지 않고 텍스처의 U 좌표로 사용하는 법 이 방법의 장점은 텍스처를 바꾸기만 해도 다양한 효과를 나타낼 수 있다는 것 (팀 포트리스에서도 적용함) 2. ceil() 혹은 floor()함수 사용 N dot L의 값을 경계로 나눠서 구분한다 음영이 너무 칼같이 끊어지기 때문에 현재 트렌드에는 좀 맞지 않는다 3. smoothstep()함수 사용 smoothstep은 ..
PBR은 특히 Specular를 위한 것이다 (대부분의 엔진에서 Diffuse는 그냥 N dot L함) 물체 겉면의 거친 정도에 따라 빛이 난반사되는 정도가 바뀐다 그 이유는 겉면이 거칠수록 미세면이 늘어나므로 그에 따라 빛도 난반사하게 되는 것이다 다시 말해 그러한 미세면을 전부 모델링할 수 있다면 복잡한 수식 없이도 사실적인 조명 연산이 가능할 것이다 하지만 이는 현실적으로 불가능하다 따라서 실제로는 거친 정도에 따라 미세면에 의한 난반사를 통계적으로 분석(근사)한 수식을 통해서 물리 기반 렌더링을 한다 매끈한 면과 거친 면의 반사 차이 왜 거친 면은 빛이 난반사 되는가 PBR 수식 F는 프레넬 항 https://gamedevforever.com/35 Fresnel Effect에 대하여. 안녕하세요 ..
DX10에서 DX11에서 특히 발전한 건 상수 버퍼에 관한 내용들 Draw Call(DrawIndex 등)를 하면 RAM의 값이 비디오 메모리, VRAM에 복사가 된다 GPU는 메인 메모리의 값을 접근할 수 없다 버텍스 버퍼를 생성할 때 버퍼를 어디에 생성할지 3가지 정도를 선택할 수 있다 1. 시스템 메모리에 생성 2. 버텍스 메모리에 생성 3. ??? HDD의 텍스트, 버텍스 정보들은 우선 RAM에 로드한 다음 그걸 PCI express를 통해 그래픽 카드에 값 복사를 한다 PCI express - 그래픽 카드를 꽂는 슬롯 다른 슬롯은 주고 받는 것에 특화되어 있지만 PCI는 보내는 것에만 특화되어 있다 물론 CPU는 VRAM에 있는 값을 읽어 올 수는 있기에 후다나 computer shading을 ..
인간의 눈은 밝기의 절대값을 인지하는 것이 아니고 밝기 값의 차이를 인지한다!! HDR 고정밀도로 표현하자 화면에 보이는 디스플레이는 정수 버퍼 즉, 최종 출력은 정수 버퍼로 해야 한다 하지만 실수 연산을 해주는 중간의 렌더링 전용 백버퍼를 만들면 고정밀도로 연산을 할 수 있다 Tonemapping HDR --> LDR? HDR을 하게 되면 무조건 필요하다 HDR은 1.0 이상의 값으로 연산을 하지만 최종적으로 모니터에 출력하기 위해서는 1.0 이하의 값으로 보간해야 한다 즉 최종적으로 제일 밝은 값은 1.0이 될 것이고 다른 값들은 Tonemapping 기법에 맞춰서 더욱 어두워질 것이다 Tonemapping에는 여러가지 기법이 있으며, 원하는 이미지에 맞춰서 잘 선택해야 한다 Linear, 레이하드,..
원리는 어렵지만 구현은 코드 2줄(...)이다 영화 산업에서는 이미 오래 전(!!)부터 Gamma Corretion은 사용되고 있었다 0 ~ 255의 중간은? 아쉽게도 127이 아니다!! 모든 광학 기기들(모니터, 스마트폰 등등)은 선형으로 보간하지 않는다 Gamma Cureve란 무엇인가? 모든 Display는 Gamma Decode를 하고 있다 따라서 Gamma Decode의 역함수인 "Gamma Encode"를 해줘야 한다 하드 디스크에 저장하는 이미지는 내부적으로 Gamma Encoding을 시킨 이미지가 저장된다!! 왜 Gamma Encode를 하는가? Gamma 비선형 함수 애플 모니터의 경우에는 2.0을 사용한다 그래서 뭐가 문제인가? 연산을 다른 공간에서 하고 있으니 평범하게 조명 연산을 ..