현재 서명 된 거리 필드를 렌더링 기법으로 사용하여 부드러운 절차 형상을 표시하는 게임 엔진을 개발하고 있습니다 (현재 링크의 것과 같은 간단한 기본 요소로 생성되어 향후 Julia와 IFS 프랙탈을 구현하려고합니다). 내 엔진은 절차 적 생성에 중점을 두어 광선을 친숙하게 만드는 방식으로 그림을 정의 해야 하기 때문에 나는이 질문에 대답하기에 좋은 장소에 있다고 생각합니다 .P.
스트리밍과 관련하여 간단한 해결책은 일종의 유형이 지정된 버퍼를 사용하여 레이 마칭을 수행하려는 경우 GPU에 던져 넣는 것입니다. 버퍼의 각 요소는 복합 유형 (예 : C / C ++의 구조체)이며 각 유형에는이를 나타내는 데 사용해야하는 기능, 위치, 회전, 배율 등 및 평균 색상을 정의하는 요소가 포함됩니다. 그런 다음 프로세스는 다음과 같이 단순화됩니다.
- 장면을 관리 가능한 하위 세트로 컬링 (절두체 컬링 및 오 클루 전 컬링은 광선 마칭 알고리즘에 의해 부분적으로 자동 수행됨)
- 서브 세트를 렌더 입력 버퍼로 전달
- 버퍼가없는 경우 버퍼를 GPU로 전달한 다음 일반적인 전통적인 레이 마칭으로 장면을 렌더링합니다. 광선 버퍼의 각 반복마다 입력 버퍼의 어떤 항목이 각 광선에 가장 가까운지를 평가하려면 일종의 단계별 검색을 수행해야하며 광선에 변형을 적용해야합니다 (이 경우 GPU에 도달하기 전에 그림 회전을 반전시켜야하거나 거리 함수 자체 (위치 변경을 위해 함수 원점 이동, 스케일 변경을위한 입방체 길이 등 조정) 등 가장 간단한 방법은 광선을 수정하는 것입니다 실제 코어 거리 기능으로 전달합니다.
그림 색상과 관련하여 셰이더를 사용하면 기본 유형뿐만 아니라 복잡한 유형도 정의 할 수 있습니다. 이를 통해 모든 것을 C 스타일 구조체에 넣은 다음 거리 함수에서 해당 구조체를 다시 전달할 수 있습니다.
내 엔진에서 각 구조체에는 거리, 색상 및 ID를 입력 버퍼의 해당 그림 정의에 연결하는 거리, 색상 및 ID가 포함되어 있습니다. 각 ID는 관련 거리 함수의 주변 컨텍스트에서 추론됩니다 (매핑 함수가 입력 버퍼를 반복하여 각 단계마다 각 광선에 가장 가까운 그림을 찾기 때문에 각 SDF가 호출 될 때 루프 카운터의 값을 안전하게 처리 할 수 있습니다 거리 값은 임의의 코어 SDF를 사용하여 정의됩니다 (예 : 해당 기능의 그림 ID).point - figure.pos
구의 경우), 색상은 그림 버퍼에있는 적절한 요소의 평균 색상 (따라서 그림 ID를 유지하는 것이 유용한 이유) 또는 저장된 평균에 가중치를 둔 절차 적 색상을 통해 정의됩니다 (예 : Mandelbulb의 특정 지점에 대한 반복 횟수, "평균 색상"을 FP 색상 공간에서 정수 색상 공간으로 매핑 한 다음 매핑 된 색상을 반복 횟수에 대해 XOR하여 팔레트로 사용합니다.
절차 적 텍스처는 또 다른 접근법이지만, 나는 그것들을 직접 사용한 적이 없습니다. iq는이 분야에서 많은 연구를 수행하고 Shadertoy에 대한 흥미로운 시연을 게시 했으므로 추가 정보를 수집하는 한 가지 방법이 될 수 있습니다.
상관없이 색상 각 도면, 절차 적 생성, 또는 마술 절차 적 텍스처로부터 샘플링 정적인지의 기본적인 논리 같다 : 중간 복합 타입의 일종 (예 구조체)으로 추상 수치 저장 모두 로컬 거리 및 지방을 해당 유형의 인스턴스에서 색상을 지정한 다음 복합 유형을 거리 함수의 반환 값으로 전달하십시오. 구현에 따라 출력 색상이 화면으로 직접 전달되거나 충돌 지점을 따라 조명 코드로 전달 될 수 있습니다.
위의 내용이 충분히 명확한 지 알 수 없으므로 의미가 없는지 묻지 않아도됩니다. HLSL로 작업하고 음영 처리를 계산 한 이후로 GLSL / 픽셀 음영 코드 샘플을 실제로 줄 수는 없지만 처음에는 제대로 작성하지 않은 모든 것을 시도해 봅니다. :).