33. 라이팅
( lerp , 투명도, )운해 =
레이 검사 위치
투명도
= 투명도가 높은 라이팅 결과
= 투명도가 낮은 라이팅 결과
34. 운해의 사전 라이팅
• 가장 투명도가 높은 운해의 기본 색상,
가장 투명도가 낮은운해의 기본 색상이 존재
• 두가지 유형에 대한 조명 계산 수행
• 조명의 감쇠는 투명도를 고려
• 잘리지 않는 정보로 투명도가 높은 부분이 밝아짐
• 투명도가 낮은 부분은 운해로 차단되어 어두워지는 경향이 있음
• 조명의 계산을 위한 모델은 생략
44. 노이즈의 쉐이더
float noise (in vec3 x)
{
vec3 f = fract(x); // 작은 숫자를 가져
// Hermine Curve
f = f * f * (3.0-2.0 * f);
• 소수 값을 추출하고 Hermite곡선 가공
45. UV 값의 가공에 대하여
• UV값을 자연적인 보완을 위해 Hermite곡선
• Hermit 곡선의 주된 이유는 매끄러운 보완을 수행하기 위한 것
선형UV값 Hermite곡선UV값
46. 노이즈의 쉐이더
float noise (in vec3 x)
{
vec3 f = fract(x); // 작은 숫자를 가져
// Hermine Curve
f = f * f * (3.0-2.0 * f);
vec3 p = floor (x); // 정수 값을 얻을
// UV계산
vec2 uv = ((p.xy +f.xy) +0.5) /256.0;
return texture (texNoise, uv) .x;
}
• Z축 고려되지 않은 쉐이더
107. 구름축소 버퍼의 해상도
●축소 버퍼의 해상도는 가로(1/4),세로(1/2)
●운해 표시의 특성상 세로의 정보가 높을 필요가 있었다
108. 축소 버퍼 용 특수 Z버퍼
●구름 그리기 전에 축소 Z 버퍼를 생성
●그릴 때 축소 Z 버퍼에서 확인 고속화
●축소 Z 버퍼는 가로 4 세로 2 픽셀의 최대 Z 값을 사용
⮚최대값을 사용하지 않는 경우 확대시 픽셀의 틈새(간격)가 발생
109. GPU의 카운터 가속화
1. 주요 장면 구름 그리기 영역에 간단한 그리기
2. 카운터 기능을 사용 픽셀 쉐이더의 시작 수를 가져옵니다
3. 카운트 값에 숫자가 들어간 경우 구름의 처리를 실시
110. 마지막으로...
●최적화에 매우 시간이 걸렸다
●Ray marching 으로 개발은 생각한 것처럼 예쁘게 만들기 쉽다
●레이수가 증가면 이쁘지만 부하가..
●타협하고 속도를 높이는데 많은 시간이 걸림
●DXR구름의 표현과 궁합이 좋은…?
●구름과 연기에 사용하기 적합한거 같음
●Value Noise는 사용이 편리
●palin 노이즈, 심플렉스 노이즈 등의 품질이 상당히 낮음
●속도는 빠름, 프랙탈도 표현
Hinweis der Redaktion
제노블레이드 2의 레이 마칭을 이용한 클라우드 표현에 대해 말씀드리겠습니다.
우선, 나는 간단히 xenoblade 2를 설명 할 것이다.
젠노부레도 2는 닌텐도가 출시하고 개발에 협력한 닌텐도 스위치 전용 RPG로, 모놀리식 소프트웨어가 개발을 담당했습니다.
ゼノブレイド2のレイマーチングを使った雲表現に関しての話をさせて頂きます。
まずゼノブレイド2に関して簡単に説明させて頂きます。
ゼノブレド2とは、任天堂様から発売、開発協力をして頂き、モノリスソフトが開発担当致しました、ニンテンドースイッチ専用のRPGです。
제노블레이드 2의 세계는 넓은 구름바다로 뒤덮인 세계입니다.
바다로 덮인 이 세상에서, 그것은 아르스라는 거대한 짐승의 상단에 살고있는 세계를 탐험 하는 RPG가된다.
모코모코 : 양털이나 뭉게구름처럼 보송보송하다는 뜻
이 세계관의 구름의 바다에 관해서는, 이미지가 방향이 된 것 같은 표정을 목표로 하고 싶다.
연기와 같은 반투명 한 표정이 있고, 바다와 같은 파형의 모코모코 느낌이 있어 구름 바다 표정입니다.
이 강의의 내용에 관해서는, 이러한 표현에 모놀리식 소프트웨어에 의해 수행 되는 방법을 설명 하 고 싶습니다., 당신과 함께 기술을 공유 하 고 개발 힌트의 일종.
우선, 구름바다를 표현할 때, 우리는 이 서신이 필수적이라고 말하는 것을 미리 결정했습니다.
첫째, 구름 바다의 모양은 파형이며,
둘째, 바다처럼 실시간으로 모양이 바뀌고,
셋째, 반투명 표현은 구름의 표현으로서 가능하다.
이 세 가지 조건은 사용할 수 있는 식에 대한 검색이 되었습니다.
세 가지 조건에 따라, 우리가 원래 고안 한 구름 바다의 두 가지 방법이 있었다.
하나는 그리드 기반 다각형에 의한 클라우드 표현입니다.
다른 하나는 파티클 기반 구름 표현입니다.
그리드 기반 표현의 예로, 정점과 다각형을 그림 의 형태로 형성합니다.
우리는 구름 바다의 파형 모양을 표현하는 프로그램으로 실시간으로 이를 변경하려고 노력했습니다.
수면등의 발현에 자주 사용되는 기법으로, 이 작품의 구름바다와 매우 양립할 수 있다고 생각되었다.
그러나, 그것은 내가 일할 것이라고 생각했던 계획이었지만, 문제는 즉시 발견되었습니다.
그것은 반투명 문제입니다.
구체적으로, 구름바다가 파형형상으로 변경되었을 때, 도면에 도시된 바와 같이 관측방향과 방향을 교차하는 다각형이 여러 개 있을 때 문제가 있었다.
다각형으로 정렬하는 문제
나는 반투명 정렬의 문제는 지금 해결되지 않는 문제라고 생각합니다.
이 두 예제 이미지는 동일한 반투명 값을 가진 빨간색과 파란색 BOX 다각형을 그립니다.
두 이미지의 차이점은 서로 다른 카메라 좌표로 캡처한 결과입니다.
왼쪽의 이미지는 문제가 되지 않습니다.
여기, 우리는 후면에 빨간 상자에서 그립니다, 우리는 다음 파란색 상자를 그립니다.
오른쪽 이미지의 경우 빨간색 BOX의 앞면을 먼저 그린 다음 파란색 BOX를 그립니다만 뒷면의 파란색 BOX가 강하게 나옵니다.
예외가 있지만 기본적으로 반투명 다각형은 카메라의 관점에서 후면에서 그리지 않는 한 올바르게 그려지지 않습니다.
이러한 작업은 후면에서 그리도록 정렬됩니다.
앞서 설명한 구름 바다 기술의 경우, 다각형에 의한 정렬에 대응할 필요가 있다.
이 문제는 CPU와 GPU 모두에 큰 부하가되고있다.
또 다른 문제는 입자 기반 접근 방식이었습니다.
이로 인해 문제가 빠르게 발생했지만, 구름바다를 표현할 때는 다량의 입자를 배치하지 않으면 표현할 수 없었습니다.
물론, 이 많은 양의 파티클 평등은 매우 높은 CPU와 GPU 부하를 일으켰으며 이는 현실적이지 않았습니다.
그래서, 최근 몇 년 동안, 광선 행진에 의해 클라우드 표현이 인기를 되기 시작했기 때문에, 이 해결 될 수 있다면? 생각했다.
모르는 사람이 있다고 생각하지만, 광선 행진에 대한 설명은 거칠다
레이 행진은 빛을 행진하고 통제하는 방법, 즉 광선입니다.
일반적인 기술은 포스트 효과입니다.
제노블레이드 2의 예는 국소 반사, SSAO 등에 사용되는 기법이다.
이러한 컨트롤은 지정된 픽셀 위치에서 좌표를 찾고, 특정 벡터 방향 또는 광선을 건너뛰고, 장면에서 정보를 선택하여 제어합니다.
그렇다면 구름 바다의 표현을 어떻게 제어할 수 있을까요?
우선, 나는 이것을 간략하게 설명 할 것이다.
이 이야기의 관점에서, 가장 중요한 것은 우리가 광선 행진에 의해 모델링하는 것입니다.
모델링에 대한 예로 구를 설명하겠습니다.
먼저 카메라에서 광선을 날리는다.
이 광선과 접촉하는 장면의 정보를 가져옵니다.
결과에 따라 모델링합니다.
모델링에 필요한 유일한 정보는 다음과 같은 것입니다.
구 반지름
구 좌표
구의 기본 색상
카메라
픽셀 쉐이더에 전달하기만 하면 됩니다.
먼저 전체 화면으로 그립니다.
다음으로 픽셀 샤이더가 시작되므로 픽셀의 관측점 벡터 또는 광선을 찾습니다.
샤이더에서 관측점 위치, 광선, 구의 위치 및 구의 반지름을 알 수 있으므로 거기에서 접촉 위치를 찾을 수 있습니다.
나는 접촉 계산의 측면에서 긴 떠날 것이다,하지만 난 당신이 충돌과 같은 컨트롤에 익숙한 경우 솔루션이 즉시 이해된다고 생각합니다.
그런 다음 색상, 법선 및 깊이는 접촉 위치에 따라 G 버퍼로 출력됩니다.
이미지는 결과의 예입니다.
Xenoblade 2는 지연 렌더링을 사용하므로 g 버퍼를 정확하게 아웃아웃하여 이미지와 같은 결과를 얻을 수 있습니다.
이 구는 정점 다각형으로 모델링되지 않지만 샤더의 연산으로 표시됩니다.
그늘에 익숙하지 않은 사람들을 위해, 후반의 설명을 전달하기 어려울 수 있습니다.
내가 말하고 싶은 것은 다각형에 의한 드로잉 기술 외에도 모양을 표현할 수 있다고 생각하면 된다는 것입니다.
제노블레이드 2의 구름바다는 이러한 기법을 적용하고, 구름의 바다를 모델화하고 표현한다.
이제 구름의 바다를 설명해 드리고자 합니다.
이미지는 실제 구름 바다의 결과입니다.
난 당신이 게임을 데리러 희망하지만, 이들은 실시간으로 변경 표현이다.
우선, 바다의 모델링을 설명하고 싶습니다.
다시 한번, 나는 바다의 모양을 파형으로 만들고 싶었다.
그렇다면 이 모양을 어떻게 계산해야 할까요? 입니다.
나는 이전에 몇 가지를 설명, 나는 많은 양의 구을 배치하고 표현하는 방법이 있다고 생각하지만, 부하가 높기 때문에 그것을 피하고 싶었다.
높은 하중의 이유는 많은 양의 볼 충돌 판단이 필요하기 때문입니다.
그러나, 파형 모양을 표현, 구의 다량을 배치 할 수있다? 말의 아이디어는 변하지 않았다.
다른 방법으로 대량으로 보인다면 해결책입니다.
그런 다음, 그것은 나온 것으로 팔린 월리 잡음이라는 소음입니다.
이 소음의 관점에서, 당신은 최근 몇 년 동안 클라우드 표현을 한 경우, 그것은 대부분의 사람들이 알고 지금 매우 중요한 소음이다.
콘텐츠는 매우 간단하고 palin 소음과 벽의 소음을 결합합니다.
월리 노이즈는 스티븐 월리(Stephen Wally)가 개발한 소음입니다. 그것은 종종 물, 돌 패턴 슈미레이트 등에 사용됩니다.
최근에는 구름의 표현과 같이 잘 설계되어 있습니다.
팔린 노이즈는 켄 펄린이 개발한 소음입니다.
그것은 종종 CG 등에서 연기와 불꽃의 표현에 사용되며, 효과와 관련된 사람은 매우 익숙한 소음이 될 수 있습니다.
설명된 두 가지 노이즈가 결합되어 사용됩니다.
벽잡이노이즈가 사용되지 않는 이유는 구름의 경우 아름다운 원의 정보보다는 엉망진창을 추가하여 보이는 목적이 자연스러워지기 때문입니다.
이 데이터의 경우 데이터를 3D 텍스처로 유지했습니다.
3D 텍스처는 이미지와 같이 일반적인 2차원 텍스처가 아니라 z 값인 텍스처입니다.
해상도로, 나는 128 픽셀로 했다.
해상도가 높을수록 품질이 높아지지만 텍스처 샘플링 부하, 용량 문제 등이 이 해상도로 해결되었습니다.
계산에 사용되는 데이터이므로 압축하기 위해 변환으로 이동하지 않습니다.
단점은 용량이 증가한다는 것입니다.
그래서 실제로 그것을 모델링 하자.
먼저 광선을 건너뜁니다.
픽셀 샤이더가 시작되는 각 픽셀 위치에 대한 원근 벡터이며, 구를 모델링할 때 설명했습니다.
그런 다음 이미지에서와 같이 광선 방향과 같은 특정 공간으로 나눕니다.
검사 좌표는 장면의 정보를 참조하고 분할된 빨간색 부분에 대한 계산을 수행합니다.
우선, 검사 과정은 구름 바다의 가장 높은 지점 아래에 존재하는지 여부를 조사합니다.
아래인 경우 구름 바다의 모델링 계산을 수행합니다.
우선, 높이를 계산에 의해 요구되고 싶은 것으로 간주한 것은 구름 바다의 깊이였습니다.
구름 바다의 상층에 존재하면 얇고, 하층이라면 어둡게 하고 싶은 표정입니다.
계산하는 것은 간단합니다.
구름 바다의 가장 높은 지점에서 광선의 위치를 빼고 구름 바다의 깊이로 나눕니다.
클램프는 구름 바다의 어둠과 함께 끝에 이루어졌다.
다음으로, 구름 바다의 투명성이 요청됩니다.
우리가 방금 찾은 구름 바다의 어둠과 샘플링 된 Palin Wally 소음을 곱하십시오.
샘플링 좌표는 처리된 레이체크 좌표를 xyz 좌표를 사용합니다.
그런 다음 보정 값을 뺍니다.
이 빼기는 지정된 값 아래의 숫자를 생략하려고 하기 때문입니다.
예를 들어 0입니다. 2에서 0 보다 작은 숫자를 원하는 경우 0을 사용할 수 있습니다. 2를 보정 값에 있고 생략합니다.
마지막으로 보정 값으로 차감되기 때문에 곱셈 값이 수행되고 수치가 해제되고 0-1로 CLAMPing의 결과가 끝에 구름 바다의 투명도가 만들어집니다.
이 투명도가 0이상이면 구름 바다로 제어됩니다.
이는 계산 수분의 결과로 모델링한 결과입니다.
모코모코라는 것을 이해한다고 생각합니다.
모델링 후, 우리는 조명에 대해 이야기 할 것입니다.
이전 이미지에는 조명 계산이 포함되어 있습니다.
조명은 구름을 표현하는 데 매우 중요합니다.
그러나 조명에서 클라우드에는 정점 법법, 일반 정보라고 하는 모델에 법선 맵이 없습니다.
이러한 기술을 사용하지 않고 조명을 할 필요가있다.
그건 그렇고, 조명이 없다면, 올바른 이미지로도 잘 이해하지 못하는 형상이 됩니다.
파형 형상을 표현하면, 자연스럽지만, 조명이 있어, 입체감이 처음으로 외관으로 인식될 수 있습니다.
조명을 위해, 나는 다음 단계에서 그것을했다.
광원 방향의 반전 벡터가 광선의 검사 위치에서 위치하는 구름 바다의 투명도를 가져옵니다.
이 반전된 벡터 거리는 데이터에서 설정할 수 있습니다.
투명도는 앞에서 언급한 계산과 동일한 기술입니다.
조명에 의해 구름 바다의 매개 변수에 대해, 사전에 가장 투명한 조명 결과는 가장 낮은 투명도 조명의 결과를 보유한다.
CPU에서 계산
결과에 따라 투명도는 선형을 보완하고 구름 바다로 제어하는 매개 변수로 사용됩니다.
이 광선 개수(분) 시퀀스를 계산한 결과는 화면에서 출력됩니다.
미리 계산된 조명의 관점에서 구름 바다의 기본 색상은 두 가지 색상을 가졌습니다.
투명도가 가장 높은 구름 바다의 기본 색상과 투명도가 낮은 구름 바다의 기본 색상이 각각 존재합니다.
이 두 가지 유형에 대한 조명 계산을 수행합니다.
투명도를 고려하여 조명의 감쇠 속도가 계산됩니다.
잘리지 않는 정보로 투명도가 높은 부분이 밝아지고,
투명도가 낮은 부분은 구름 바다로 차단되어 어두워지는 경향이 있는 정보가 됩니다.
나는 각 회사가 조명의 계산을위한 조명 모델을 가지고 있다고 생각, 그래서 나는 세부 사항을 떠날 것이다.
이미지는 투명도를 얻기 위한 거리의 차이입니다.
거리의 차이가 있었기 때문에 외형이 상당히 바뀌었습니다.
이 거리는 데이터에 의해 자유롭게 설정할 수 있도록 만들어졌습니다.
이 투명도를 얻을 때 광선 수를 늘리는 것이 가장 좋은 표현 기술이며, 더 많이 증가할수록 조명이 더 자연스럽지만 부하 문제로 인해 샘플링이 하나만 있습니다.
기본적인 모델링과 조명을 했지만 여전히 구름처럼 보이지 않습니다.
그것은 구름의 단단한 바다처럼 보인다.
여기에 연기처럼 보이도록 노이즈 계산을 추가했습니다.
추가된 소음은 창백한 소음입니다.
이 노이즈의 결과는 투명도에 대해 곱해졌습니다.
Perin 노이즈 정보는 3D 텍스처에 저장되며 해상도는 128입니다.
노이즈를 추가하는 이미지의 예입니다.
연기가 자욱한 분위기를 추가하고 구름이 매우 가깝게 접근했습니다.
결과는 좋았지만, 나는 그것에 대해 걱정했다.
3D 텍스처에 저장할 때 해상도가 128이었으며 비슷한 소음이 자주 발생했습니다.
바다의 통제 특성으로 인해 가까운 시야에서 볼 수있는 상황이 많았고 유사성에 대해 우려했습니다.
또한 3D 텍스처를 종료하고 GPU 내에서 palin 노이즈를 계산하는 방법에 대해 생각했지만 부하가 매우 높기 때문에 현실적이지 않습니다.
3D 텍스처의 해상도를 줄일 수는 있지만 용량도 증가하고 텍스처 크기가 증가하여 샘플링 부하가 증가했습니다.
어떻게 든 대처할 수 없다고 말함으로써 다양한 조사의 결과로, 나는 또 다른 소음으로 변경하려고합니다.
즉, 가치 잡음입니다.
값 노이즈는 난수로 얻은 정보에 따라 계산되는 노이즈입니다.
그것은 매우 간단한 소음 기술입니다.
Perlin 노이즈보다 품질이 낮지만 더 빠르게 계산할 수 있습니다.
우리는이 기술을 적용하고 제어할 수 있습니다.
값 노이즈 난수 정보는 2D 텍스처에 저장되었습니다.
해상도는 256입니다.
이 문서에서는 이 텍스처를 임의의 텍스처라고 합니다.
ValueNoise는 먼저 그림에 표시된 대로 노이즈의 참조 위치에서 가장 좋은 네 개의 난수 정보를 획득하고 선형 완료 작업을 수행하고 숫자를 출력합니다.
그게 전부입니다.
그것은 소음 계산으로 매우 간단합니다.
GPU인 경우 하나의 텍스처 샘플링이 작업을 수행합니다.
텍스처 참조는 일반 컨트롤보다 훨씬 빠른 하드웨어에서 선형 완료 계산을 수행합니다.
이러한 측면에서 값 노이즈는 GPU에 대해 매우 호환되는 노이즈 계산입니다.
실제 소음 제어 절차를 설명하겠습니다.
그것은 갑자기,하지만 난 실제 그늘을 보고 하려고합니다.
너무 많이 보더라도 이해하기 쉽지 않다고 생각합니다.
나는 순서대로 설명하고 싶습니다.
먼저 인수 x는 샘플링 위치입니다.
광선 검사 좌표로 처리된 숫자 값으로 구성됩니다.
이 처리 값은 구름 바다 측의 매개 변수로 재생하도록 만들어집니다.
다음으로 몇 가지 점이 추출되고 결과는 에르미트 곡선으로 처리됩니다.
왜 은하 곡선으로 처리하는 것은 임의의 텍스처에 대한 액세스와 관련이 있습니다.
왼쪽 그림은 선형 UV 값을 나타내고 오른쪽 그림은 에르미트 곡선의 UV 값입니다.
Hermit 곡선의 주된 이유는 매끄러운 보완을 수행하기 위한 것입니다.
구름과 같은 노이즈의 경우 선형으로 매개변수를 변경하는 것보다 곡선에 곡선을 곱하는 것이 더 자연스럽기 때문에 이 작업이 수행됩니다.
그런 다음 임의 텍스처의 UV를 계산하고 임의 텍스처의 결과를 출력합니다.
먼저 샘플링 좌표에서 정수를 찾습니다.
그건 파란색 부분입니다.
정수를 찾아 이전에 계산된 elmy 및 곡선을 추가합니다.
UV 계산의 일부(256)는 임의의 텍스처의 해상도, 0이다. 5를 추가하고 256으로 나누어 UV 공간으로 처리합니다.
UV 결과는 노이즈의 결과로 임의의 텍스처및 출력으로 샘플링됩니다.
이것은 기본적인 노이즈 계산이지만 이 샤이더에 문제가 있습니다.
인수 Z는 고려되지 않습니다.
노이즈 계산을 위해 Z를 고려해야 합니다.
이는 좋지 않은 예이지만 z축 계산을 생각하지 않고 Z 값을 추가하면 Z축의 이동이 XY 축의 이동과 비슷해집니다.
그게 문제입니다.
Z축을 고려하는 방법에 대한 이야기가 됩니다.
Z를 고려하기 위해 두 가지 유형의 UV를 준비하고 샘플링하는 방법을 설명합니다.
먼저 UV0의 경우 Z 값의 정수 값에노이즈 오프셋을 곱합니다.
노란색 부분입니다.
이 노이즈 오프셋은 z축 이동에 따라 변경되는 픽셀 수입니다.
Uv1의 경우 Z의 정수 값에 하나를 추가한 결과입니다.
이 두 UV는 임의의 텍스처에서 샘플링하는 데 사용됩니다.
이 샘플링의 결과는 낮은 수의 Z를 사용하여 선형 완료 처리를 수행하여 노이즈의 결과입니다.
노이즈 오프셋을 정수로 이동하면 낮은 숫자를 사용하여 선형 완성을 사용하여 단계별 이동을 촉진하여 자연 Z 값을 고려한 노이즈가 변경됩니다.
다음, 최적화에 대해
이전 방법에서는 노이즈 계산에서 샘플링 수가 두 번 발생했습니다.
이를 가속화하기 위해 G 채널에 임의의 텍스처에 대한 정보도 있습니다.
구체적으로, 첫 번째 단계는 임의의 텍스처를 노이즈 오프셋 분으로 이동하는 것이다.
이것은 반복 이동입니다.
있는 대로 이동하면 설명이 없는 영역이 발생하기 때문에 루프 설정이 됩니다.
이 이동의 결과를 임의 텍스처의 G에 저장합니다.
이렇게 하면 샤더를 조정하고 텍스처를 한 번 샘플링할 수 있습니다.
G 채널에 노이즈 오프셋 이동 정보가 있는 경우 샤더는 다음과 같습니다.
먼저 노이즈 오프셋과 정수 Z를 고려하여 UV를 계산합니다.
VUv의 샘플 텍스처
생성된 R과 G는 노이즈의 결과로 z 소수점 및 출력을 사용하여 선형적으로 보완됩니다.
이 속도.
전체를 다시 살펴보겠습니다.
먼저 소수점과 에르미트 곡선을 찾습니다.
그런 다음 Z축을 고려하여 UV 값을 찾습니다.
텍스처, 선형 소수점의 z축 완성및 컨트롤을 참조하십시오.
이 흐름 시퀀스는 기본 노이즈 계산입니다.
마지막으로, 이전 노이즈 연산은 샘플링 거리에 의해 처리되고, 세 번 계산되고, 합성된다.
노이즈의 결과로 품질이 낮기 때문에 한 번만 제어할 수 있습니다.
이 방법은 패긴 노이즈와 유사합니다.
일련의 흐름에 의해 계산된 노이즈의 결과입니다.
매개 변수에 따라 결과가 다른 것을 볼 수 있습니다.
팔린 노이즈보다 더 나쁘지만 고속으로 제어할 수 있으며, 3D 텍스처와 달리 매개변수 조정을 통해 결과를 변경할 수 있다는 장점이 있습니다.
이것은 결과입니다.
동영상이 언제인지 이해하기가 조금 더 쉽지만 이미지라면 그게 다야?
할 이미지가있을 수 있습니다.
값 노이즈의 장점은 매개 변수가 모양을 변경할 수 있다는 것입니다.
매개 변수로 처리하여 이미지의 3D 텍스처 결과에 가깝게 볼 수 있습니다.
3D 텍스처의 경우 텍스처 데이터를 변경하지 않으면 이 문제를 처리하기가 어렵습니다.
제노블레이드 2에서는 클라우드 바다의 매개 변수를 상황에 맞게 조정하고 싶었기 때문에 마침내 가치 노이즈를 채택했습니다.
위의 기술은 ShaderToy라는 glsl을 설명하는 사이트에서 사용됩니다.
나는 또한이 사이트를 참조 응답.
당신이 특정 기술에 대해 배우고 싶다면, 나는이 사이트가 배울 수있는 가장 짧은 방법이 될 것이라고 생각했다.
다시 구름바다이야기로 돌아오겠다.
그것은 좋아 보였지만 또 다른 문제가 있었습니다.
그것은 거리로 인한 외관의 문제였다.
왼쪽 이미지의 구름 바다 매개변수는 짧은 거리에 맞게 조정되며 근접에서 볼 때 특히 문제가 되지 않습니다.
먼 뷰에서이 매개 변수를 보면 오른쪽이미지에서와 같이 끔찍한 루프처럼 보입니다.
가까운 보기로 조정 된 것은 당연하지만 가까운 보기에는 문제가 없습니다.
그러나 먼 뷰에는 매우 문제가 있으며 루프가 두드러집니다.
동시에 부하에 문제가되었습니다.
클로즈 뷰에서 조정된 컨트롤로 텍스처 캐시를 쉽게 칠 수 있으며 샘플링이 됩니다.
인접 한 픽셀은 종종 인접 한 텍스처를 참조 하기 때문에.
반대로 텍스처의 샘플링 하중은 원거리 뷰에서 증가합니다.
인접 픽셀의 거리는 먼 정보로 구성되므로 텍스처는 노이즈 샘플링 계산시 캐시에 의해 충돌되지 않으므로 부하가 증가합니다.
하중은 평소보다 3배 이상 높았습니다.
이것은 해결되어야 하는 필수적이었습니다.
다루기 쉽습니다.
각각 짧은 거리, 중간 거리 및 장거리에서 적절한 샘플링 거리로 변경하였다.
그러나, 짧은 거리, 중간 거리 등이 혼합되는 영역은, 두 가지 종류의 제어가 발생하기 때문에, 또한 영역의 하중이 올라가는 문제점이 있다.
나는 이것을 다룰 수 없었다.
속도 향상에 대응하여 중거리 및 장거리 거리에 따라 샘플링 횟수를 줄이는 컨트롤을 추가했습니다.
실제 결과는 이미지와 같습니다.
노란색 반점은 먼 거리입니다.
파란색은 중간 거리입니다.
녹색은 짧은 거리입니다.
그 지역이 당겨지면 그런 느낌이 됩니다.
루프가 더 두드러지고 있습니다.
이것은 거리의 문제를 감소.
다음으로, 나는 글을 보충 할 것이다.
글을 쓸 때 그림자 맵 결과도 살펴보았습니다.
이미지 왼쪽에는 그림자 맵이 없으며 오른쪽은 그림자 맵입니다.
그림자 맵을 참조하면 입체 효과가 증가하여 자연스러운 모양이 되었습니다.
시간 변경과 같은 조명 매개 변수의 변경으로 인해 전용 제어가 없었습니다.
그냥 조명 매개 변수를 조정하고 바다가 잘 작동합니다.
이러한 종류의 렌더링 기법은 다른 흐름에 대한 조명 계산 및 기타 요소를 결합하여 문제를 사전에 방지합니다.
또 다른 포인트로,
구름 바다의 드로잉의 경우 축소 버퍼에 그려지고 마지막 프레임에 그려집니다.
물론 이는 부하를 줄이기 위해 축소 버퍼에 그려집니다.
감소 버퍼, 색상, 투명도 및 깊이의 출력 내용이 출력됩니다.
색상에 관해서는 구름바다를 그리는 결과는 현재의 결과로 출력됩니다.
투명도는 광선의 수의 더 큰 투명도를 출력합니다.
깊이는 투명도 0입니다. 0보다 크고 광선에서 가장 깊이를 출력합니다.
축소 버퍼에 출력한 후 이 결과를 사용하여 장면으로 복원합니다.
깊이를 내는 이유는 불편함 없이 메인 씬을 반영하기 위함입니다.
구체적으로, 투명도는 구름 바다의 깊이와 주 장면의 깊이 사이의 차이에서 계산된 다음 구름 바다의 투명도를 곱하고 최종 장면에 출력합니다.
이를 통해 구름의 바다는 메인 장면에서 불편함 없이 반사되었습니다.
다음 초기 값의 정상성에 대해서는
구름 바다의 광선 행진과 관련하여 시작 ING 위치가 정의되지 않으면 하중이 예기치 않게 됩니다.
정의되지 않은 경우 구름 바다의 관측점 위치와 최종 깊이 값에 항상 광선 계산이 필요합니다.
그러나 실제 구름 바다 계산에 관해서는 이미지의 영역 부분에 대한 불필요한 광선 제어가 됩니다.
그것은 매우 쓸모없는 계산입니다.
이미지에서와 같이 구름 바다와 관측점이 가까우면 아직 문제가 되지 않지만 구름 바다와 관측점이 멀리 떨어져 있으면 부하가 올라오게 됩니다.
따라서, 레이 벡터와 구름 바다의 가장 높은 지점의 접촉 위치는 그늘에서 사전에 요청되고, 거기에서 그것을 계산한다.
이렇게 하면 쓸모없는 계산이 미리 생략되고 가속화됩니다.
실제 구름 바다 드로잉에 관해서는, 이미지는 그리기 위해 거대한 원뿔 다각형을 사용했다.
원뿔 다각형을 그리면 픽셀 섀이든이 필요한 경우에만 활성화되고 가속됩니다.
구름 바다의 또 다른 표현으로 구멍을 만들 수 있었다.
매개 변수로 구름 바다의 구멍을 변경하는 위치와 반경을 정의하고 그늘진 자의 구멍을 뚫습니다.
그것은 구름 바다가 이미지에서와 같이 떨어지는 등의 표현에 사용되었다.
또 다른 포인트는 수직으로 구름의 바다를 배치 할 수 있다는 것입니다.
이 작업은 샤이더에서도 계산됩니다.
결과적으로, 그것은 이미지 처럼 느낀다.
예를 들어 구름 벽이 있는 상황의 지도와 같이 사용합니다.
실제로 는 사용하지 않았지만, 월리 노이즈와 밸류노이즈가 아닌 구름바다의 표현으로서, 밸류노이즈와 밸류노이즈도 곱한 좋은 외관이었습니다.
우리가 이것을 사용하지 않은 이유는 구름의 바다가 역학으로 너무 많이 바뀌었기 때문입니다.
조금 더 조정하면 이것도 사용할 수 있습니다. 제 생각에는.
구름 바다에 대한 설명을 끝내자.
다음 하늘 구름을 설명하겠습니다.
하늘 구름이란? 그러나 그것은 이름 남아있다.
그것은 하늘에 떠있는 구름입니다.
제노 블레이드 2는 하늘 구름에 대한 그리기 경로로 다음과 같은 절차입니다
먼저 SKyMap을 만듭니다.
다음으로, 이 만든 SkyMap을 참조 하 고 축소 버퍼에 하늘 구름을 그릴 것 이다.
이 수축 버퍼의 결과는 주 장면에 그려지고 완료됩니다.
우선, 스카이맵에 대해 설명하고 싶습니다.
구름이 있는 위치에 대한 정보로 SkyMap이라는 텍스처를 준비했습니다.
정보를 2D 텍스처로 보유합니다.
이러한 계산은 실제 컴퓨터에서 실시간으로 계산됩니다.
계산 기법으로 ValueNoise를 사용하고 매개 변수에 따라 결과가 변경됩니다.
숫자가 높을수록 구름이 두꺼워지게 됩니다.
실제 결과는 다음과 같습니다.
왼쪽 위 이미지는 SkyMap에서 희소한 구름이 있는 매개변수입니다.
클라우드의 실제 결과는 이미지의 느낌입니다.
흐린 날씨에 이미지에 관해서는 매개 변수가 발생했습니다
그것은 그림자를 가짐으로써 단순한 흐린 결과가 되지 않습니다.
그런 다음 실제 스카이맵 참조와 관련하여
스카이맵 참조에서 별의 매개변수를 정의했습니다.
매개변수는 별의 반지름, 구름의 위치 및 구름의 높이입니다.
첫째, 별의 반경에서 수평선의 선을 정의합니다.
다음으로, 구름이 발생하는 영역을 살펴봅니다.
위에서 이전 결과를 보면 그림처럼 보입니다.
SkyMap은 구름이 발생하는 이 수평선 위의 영역을 나타냅니다.
SkyMap UV 좌표는 실제 좌표의 XZ를 변환하는 데 사용됩니다.
구름의 바다처럼 하늘 구름의 모델링으로, 먼저 광선을 비행.
광선은 이전과 같이 픽셀 샤이더의 픽셀 위치의 벡터 방향입니다.
다음으로 광선과 접촉하는 하늘 구름의 시작 및 끝 위치를 찾습니다.
자세한 충돌의 계산 방법은 생략되었지만 구의 반경, 구름의 높이 및 광선의 방향에서 접촉 위치를 찾을 수 있습니다.
시작 위치와 끝 위치가 결정되므로 광선 검사가 영역에 분산됩니다.
구름 바다의 시간처럼 시작하고 끝나는 이유는 쓸모없는 광선 검사를 수행하지 않기 때문입니다.
하늘 구름을 제어하는 측면에서, 그것은 세대의 중심에 가까울수록, 구름이 어두워지고, 구름이 얇아지고, 바람이 얇아집니다.
이러한 컨트롤은 또한 구름의 바다에 매우 가깝습니다.
구름바다에서는 구름바다의 가장 높은 지점과 깊이에 대한 정보가 계산되었다.
계산 방법은 구름의 바다만큼 복잡하지 않습니다.
우선, 하늘 구름의 어둠이 요구됩니다.
하늘 구름의 중심점과 광선 검사 위치의 차이를 추구하고 구름의 높이로 나눈 것은 하늘 구름의 두께입니다.
이 어둠에서 벽의 노이즈는 구름의 바다뿐만 아니라 보정 값을 곱하고 곱하고 투명도가 결정됩니다.
빼기와 곱셈의 의미에 대한 이유는 클라우드 바다뿐만 아니라 사양의 다음과 같은 수치 값을 생략하고자하기 때문입니다.
조명은 또한 구름의 바다에 매우 가깝습니다.
광선 검사의 위치에서 광원의 반전 벡터 방향으로 참조를 결정합니다.
참조의 투명도는 이전 계산에서 결정됩니다.
구름의 바다와 마찬가지로 선형 완성은 가장 투명한 조명과 가장 투명한 조명을 기반으로 하며, 이는 미리 계산되며 빈 구름 수를 기반으로 합니다.
이러한 흐름 앉아서 분, 광선 확인을 수행
이미지는 이전 기술에 의한 계산의 결과입니다.
구름의 바다뿐만 아니라 연기의 감각이 없기 때문에 소음을 추가합니다.
값 노이즈는 연기감을 표현하는 데 사용됩니다.
소음은 그 어느 때보다 도배되고 제어됩니다.
제노블레이드 2의 하늘 구름은 이런 식으로 표현된다.
마지막으로 모델 클라우드에 대해 설명합니다.
디자이너 측에서 구름 바다에 또 다른 구름을 배치해 달라는 요청이 있었습니다.
이를 처리하기 위해 모델 클라우드라는 기술에 대응했습니다.
모델 클라우드는 설계자가 어떤 셰이프를 배치할 수 있도록 하는 클라우드 표현입니다.
모델 셰이프로볼록다각만 메시만 만들어졌습니다.
배열에 관해서는, 디자이너는 MAYA에 배치됩니다.
마야는 이미지로 배치되었다
게임의 카메라는 이 배치된 다각형의 중앙에 있습니다.
상층의 후면에서 상당히 바라보는 것으로 생각하십시오.
이미지는 배치 정보를 그린 모델 클라우드입니다.
게임에서이 화면과 같은 것은 없지만 맨 위 레이어에서 이처럼 보입니다.
이제 모델 구름 그리기 단계를 살펴보겠습니다.
모델 클라우드는 먼저 디자이너에 배치 된 다각형 메시를 그립니다.
그려진 모델 구름의 픽셀 쉐이더 내에서 전용 구름 광선행진을 제어합니다.
파란색 선은 모델 구름의 다각형 메시 모양입니다.
셰이프에 맞는 구를 정의합니다.
이 구는 다각형 메시의 모양에 따라 자동으로 생성됩니다.
다음 정의 된 공과 광선 접촉점은 두 점으로 점수가 매겨지며 점수가 매겨지며,
시작 및 끝 위치에 대한 정보입니다.
그런 다음 시작 및 끝 위치를 분할하고 이전과 같이 광선 검사를 수행합니다.
우리가 시작과 끝 위치를 요청한 이유는 불필요한 광선 검사뿐만 아니라 구름 바다와 하늘 구름을 수행하지 않기 때문입니다.
모델 구름의 중심점에 가까울수록 구름이 어두워지고 구름이 더 얇아집니다.
구름 바다의 깊이, 하늘 구름의 높이 및 모델 구름의 중심점까지의 거리입니다.
계산 방법으로, 그것은 현재와 크게 다르지 않다
모델의 중심 위치와 광선 위치 사이의 거리를 결정하고 모델 구름의 반지름으로 나눕니다.
이 것을 모델 클라우드의 어둠으로 만들어 봅시다.
그런 다음 모델 구름에 어두움과 값 노이즈를 곱하고 보정 값을 빼고 끝에 곱한 다음 투명도를 찾습니다.
나는 값이 잡음이 언급되는 점을 제외하고는 거의 유사한 작업이라고 생각합니다.
벽의 노이즈를 사용했지만 모델 클라우드에서는 값 노이즈를 사용합니다.
값 노이즈는 혼란을 원했기 때문에 모델 클라우드에 채택됩니다.
다음, 모델 클라우드의 조명에 대해
이것은 이전과 거의 동일한 기술입니다.
라이트 방향의 광선 위치에서 반전된 벡터 방향으로 모델 구름의 투명도를 결정합니다.
투명도에 기초하여 선형 완성에 의한 조명 계산이 수행되었고 모델 클라우드의 수치값이 만들어졌습니다.
이 수의 레이미지 검사를 반복하고 결과를 출력합니다.
조명 모델 클라우드의 관점에서 여러 모델을 참조하고 계산하는 방법이 가장 고품질의 방법이었습니다.
그러나 이러한 메서드는 부하가 부디 올라갈 것이기 때문에 포기되었습니다.
이러한 기술에 대해서는 우주분업 등을 수행하여 통제할 수 있는 곳이라고 생각하지만, 여러 가지 문제를 포기했다.
그리고 이전과 마찬가지로 끝, 출력에 다시 값 노이즈를 추가하고 모델 클라우드의 결과로 구성됩니다.
모델 구름 의 도면 의 흐름입니다.
보충 정보로서
감소된 버퍼의 해상도로서, 1과 4수평, 1과 2수직이다.
높은 수직 해상도의 이유는 구름의 바다였다.
디스플레이 컨트롤의 특성상 측면에서 볼 수 있는 관점이 많았기 때문에 구름 바다에서는 수직 정보가 꼭 높은 것이 필요했습니다.
따라서, 나는 특별한 해상도로 합니다.
구름 바다가 없다면 수직과 수평으로 1과 4를 선택했다고 생각합니다.
구름이 그려지기 전에 특수 Z 버퍼도 사용할 수 있었습니다.
구름의 바다, 하늘 구름, 모델 구름, 모든 도면은 축소 Z 버퍼를 볼 수 있습니다.
z 버퍼로 확인하여 불필요한 픽셀 샤이더의 시작을 사전에 피하고 속도를 높이고 있었습니다.
축소 Z 버퍼를 생성하기 위한 조건으로, 수축 정보를 생성할 때 최대값 4픽셀 및 길이 2픽셀의 z 값이 사용된다.
이는 최대값을 사용하지 않을 경우 확장시에 그려지지 않는 픽셀의 간격이 발생할 가능성이 있기 때문이다.
이제 스위치에 GPU 이벤트 수를 계산할 수 있습니다.
나는 이것이 스위치에 국한되지 않고 대부분의 하드웨어에 국한되지 않는다고 생각합니다.
이 카운터 함수는 구름을 그리기 전에 구름이 그려진 영역에 대한 주 장면에 대한 매우 간단한 그리기 프로세스를 수행하는 데 사용됩니다.
카운터 함수를 사용하면 픽셀 샤이더가 활성화되거나 계산되며 카운트 값이 하나도 있는 경우 제어 형태로 속도가 빨라지기도 합니다.
실내 등에 들어갈 때에는 CPU상에 구름을 그리지 않는 등의 제어가 상응하였으나, 제노블레이드2는 매우 넓은 맵이기 때문에, 이러한 핸드헬드 대응에 한정되어 있기 때문에, 이러한 컨트롤을 추가하여 속도를 수행하였고, 속도를 수행하였다.
구름의 바다를 표현하는 가장 어려운 부분은 최적화였습니다.
광선 행진으로 표정을 개발하는 것을 생각한 것처럼 아름답게 만드는 것은 매우 쉽습니다.
특정 기술이 결정되면 광선의 검사 수가 증가하면 모양이 아름답습니다.
그러나 실제로는 작동하지 않습니다.
광선 수를 늘리면 아름답게 되더라도 하중이 비례적으로 증가합니다.
타협하고 속도를 높이는 방법을 알아내는 데는 많은 시간이 걸렸습니다.
외관에 관해서는, 그것은 상당히 일찍 완료되었지만, 최적화의 작업은 정말 마지막 순간에 가고 있었다.
미래에 비슷한 일을 하거나 비슷한 일을 하는 사람들이 있다면, 이 최적화를 위해 많은 시간이 걸릴 것이라고 생각합니다.
또한 레이트레이싱을 중심으로 화제가 된 dxr이 구름의 표현과 호환된다는 느낌이 들었습니다.
특히 후반부에 설명된 모델 클라우드의 조명 부분, 즉 광선 행진이 계산되지만 이 부분은 DXR에서 접촉할 다각형 목록을 찾는 데 사용됩니다.
이를 바탕으로 계산하는 것으로 고속 조명을 할 수 있다고 생각합니다.
DXR 기능을 추가하면 향후 구름과 연기의 표현이 향상될 것이라고 생각했습니다.
가치 소음에 관해서는, 나는 개인적으로 매우 처리하기 쉬운 소음이라고 생각했다.
palin 노이즈, 심플렉스 노이즈 등의 품질이 상당히 낮습니다.
그러나 고속측이 좋고, 고해상도의 프랙탈을 표현할 수 있는 점이 매력,
앞으로는 프랙탈 관련 작업과 텍스처 블렌딩을 모델 중심으로 사용할 수 있을 것이라고 생각했습니다.