라인 폭이 가변적 인 툰 / 셀 쉐이딩?


15

셀 셰이딩에 대한 몇 가지 광범위한 접근 방식이 있습니다.

  1. 뒤집힌 법선이있는 모형의 복제 및 확대 (나를위한 옵션이 아님)
  2. Sobel 필터 / 프래그먼트 셰이더가 에지 감지에 접근
  3. 에지 감지에 스텐실 버퍼 접근
  4. 면 및 모서리 법선을 계산하는 형상 (또는 정점) 셰이더 접근 방식

지오메트리 중심 접근 방식이 조명 및 선 두께를 최대한 제어 할 수 있다고 가정하면 정확합니다. 언덕의 실루엣 선이 점차 평야로 합쳐지는 지형을 위해?

지형 표면에 픽셀 조명이 필요하지 않은 경우 어떻게합니까? (그리고 아마도 셀 기반 정점 또는 텍스처 맵 기반 조명 / 그림자를 사용할 계획이 아닐 것입니다.) 그런 다음 지오메트리 유형 접근 방식을 고수하거나 화면 공간 / 조각 접근 방식을 사용하는 것이 좋습니다. 일을 더 단순하게 유지하려면? 그렇다면, 어떻게 언덕의 "잉크"를 얻을 것 것이 아니라, 메쉬 실루엣 그 윤곽 내부 아니오 "잉크"세부 사항 전체 메쉬 (의 윤곽? (AKA 암시 윤곽 , 주름 ).

마지막으로 지오메트리 쉐이더를 사용하여 뒤집힌 법선 접근 방식을 저렴하게 에뮬레이트 할 수 있습니까? 이것에 대한 나의 관심은 모든 정점을 확실히 복제하고 이에 따라 크기를 조정할 수 있다는 것입니다.

내가 원하는 것-실루엣 내부에 침입 선이있는 다양한 선 두께 ...

여기에 이미지 설명을 입력하십시오

내가 원하지 않는 것 ...

여기에 이미지 설명을 입력하십시오


편집 : 추가 연구 결과는 다음과 같습니다.

거리 기반 LoD를 고려하더라도 지형에 엄청난 정점 수가 있기 때문에 플립 노멀이나 기하학 쉐이더 기반 접근 방식 (절두체 컬링 포함)은 모두 중복 및 스케일링과 관련된 계산상의 복잡성으로 인해 합리적인 옵션이 아닙니다. 정점을 업로드했습니다.

지형 표면에 단색 톤 쉐이딩 형태의 픽셀 당 조명이 필요하지 않다는 점을 고려할 때, 얼굴 노멀 기반 접근법을 고려하는 것이 현명하지 않습니다. 당연히 계산하기에 상당히 비쌉니다. 그러나 이들이 최상의 제어 수준을 제공하는 것은 사실입니다. 예를 들어 "예술적"획을 사용하여 가장자리를 음영 처리하는 기능 : 아름답지만 다시 말해서 방대한 복잡한 게임 환경에서는 실제로 실행되지 않습니다.

스텐실 버퍼는 쉐이더에서 모든 작업을 선호하기 때문에 오히려 피하고 싶습니다. (빨간색 윤곽선이 표시된 위의 예는 스텐실 버퍼-구식 학교로 수행되었습니다.)

조각 쉐이더 이미지 공간 접근 방식이 남습니다. 계산 복잡도가 정점 수가 아닌 조각 수로 줄어 듭니다 (제 경우에는 지오메트리 쉐이더에서 해야하는 것보다 10-100 배 적은 작업입니다). 불연속 필터 (예 : Sobel 연산자)를 적용 할 수있는 g 버퍼 (일반 버퍼 및 선택적으로 깊이 버퍼로 구성)를 생성하려면 둘 이상의 렌더 패스가 필요합니다. 깊이 불연속은 암시적인 윤곽과 주름을 가능하게합니다. 이 접근 방식의 유일한 퀴즈는 잉크로 처리 된 가장자리 너비를 미세하게 제어 할 수 없다는 것입니다. 단편 쉐이더의 올바른 알고리즘을 사용하면 이것이 가능할 것이라고 확신합니다.

이제 질문이 더 구체적이 되었습니다. 조각 셰이더에서 특히 바깥 쪽 실루엣에서 가변 가장자리 너비를 얻는 방법은 무엇입니까?


다양한 선 두께는 기하학적 접근 방식의 특징입니다. 다른 방법으로는 효율적으로 얻을 수 없습니다. 당신이 그것을 원하기 때문에, 나는 픽셀 쉐이더를 "보다 효율적인 방법"으로 보지 않습니다. 검색 할 픽셀 수 = (line_thickness * 2 + 1) ^ 2-1. 기본적으로 포스트 프로세스 쉐이더를 의미합니다. 최대 인 경우 속도가 많이 (추정치 : 10 배) 느려집니다. 선 너비는 2와 같습니다. 사전 심사를 삭제하고 지오메트리 셰이더 접근을 시도하십시오.
snake5

@ snake5 GS에서 렌더 업데이트 당 1 억 5 천만 개의 정점 (뷰 컬링과 함께 약 2 천 5 백만 개)을 실행한다고 정직하게 제안하고 있습니까? 나는 그것을 정말로 사지 않지만 입력에 감사드립니다. 정점 수와 복잡성에 대해 위에서 언급 한 내용을 다시 참조하십시오. 10 배의 피겨로도 조각 쉐이더는 적어도 균일하게 그려지고 아마도 훨씬 나아질 것입니다.
엔지니어

1280x720에서 2,500 만 개의 정점 (선형 읽기 / 쓰기) 대 2,300 만 개의 텍스처 샘플 (캐시 메모리 읽기 성능 저하 + 렌더 대상 데이터 압축 해제). 그런데 정점 수를 제한 / 감소하는 것이 훨씬 쉽습니다. 특히 요즘에는 대형 모니터 (1920x1080 +) 및 다중 모니터 설정이 인기를 얻고 있습니다.
snake5

빨간색 윤곽선을 생성 한 다음 동일한 깊이를 기반으로 선을 얇게하고 자라는 것과 동일한 알고리즘을 사용하는 것은 어떻습니까?
Ali1S232

@Gajoo, 내가 질문에서 말했듯이, 그것은 단지 실루엣에 관한 것이 아닙니다. 첫 번째 이미지에서 소녀의 어깨 뒤에 방해가되는 선을 주목하십시오. 그것들은 뒤집힌 법선 접근법의 기능이며, 암시적인 윤곽 / 주름의 역할을합니다. 나도 그래
엔지니어

답변:


4

심도 버퍼의 불연속 필터링을 통해 조각 쉐이더 방식을 사용하기로 결정했습니다. 이에 대한 이유는 다음과 같습니다.

  1. 월드 버텍스 카운트는 메시 LoD에서도 거대한 뷰 거리로 인해 매우 높습니다.
  2. 같은 패스에서 동일한 구조 (박스 또는 가우시안 샘플링 / 필터링)로 이점을 얻을 수있는 DoF 블러와 같은 다른 여러 조각 쉐이더 작업을 수행하고 있습니다.

그것을 테스트 한 후에, 나는 미래의 프로젝트에서 복잡성 이유로 대신 기하학 기반 접근법을 사용할 것이라고 말합니다. 그 이유는 (설명에서 다른 사람들이 제안한 바와 같이) 에지 감지에 대한 프래그먼트 셰이더 접근 방식은 특히 혼동 반경의 원과 프래그먼트 당 샘플 수가 매우 높은 DoF 구현에서 계산적으로 강렬 할 수 있기 때문입니다. 다행스럽게도 아웃 라인 셰이더에 대한 걱정은 덜합니다.


평범한 불연속을 사용하면 평평한 법선이있는 경우 더 나은 결과를 얻을 수 있다고 생각합니다. 샘플을 더 멀리 가져 와서 선 너비를 변경할 수 있습니다.
Grieverheart

@Grieverheart 이것은 내가 사용하는 방법이 잘 작동하기 때문에 허용되는 대답입니다. 감사.
엔지니어

0

애프터 이펙트를 사용할 수 있다면 실제로 매우 쉬운 솔루션이 있습니다. 가장 좋은 점은 폴리 카운트가 얼마나 큰지 중요하지 않다는 것입니다. 깊이 맵을 그레이 스케일로 렌더링 한 다음 인접한 두 픽셀 사이의 대비가 임계 값보다 높을 때 원하는 선 색상으로 점을 만듭니다. 렌더링 한 이미지의 대비 및 / 또는 조명 수준에 따라 도트를 더 크게 만들 수 있습니다.

나는이 솔루션을 만든 프랑스 친구 이전에도 2000/2001 년에 toonShader 알고리즘을 발명했습니다. 광산은 실제 재료 형상을 기반으로했습니다. 그런 다음 기본적으로 두 가지 방법이 있습니다. 1. 법선을보십시오. 법선에 연결된 두 평면이 카메라를 향하고 카메라를 향하고 있다면 그 선을 렌더링하면 깊이, 조명 등을 선 심도의 신호로 사용할 수 있습니다. 2. 렌더링 된 지오메트리를 봅니다 (그래서 원근 변환 후) 연결 평면의 꼭짓점이이 선분의 같은쪽에 있으면 선을 렌더링합니다. 그런 다음 선 두께에 대해 동일한 작업을 수행 할 수 있습니다. 방법 1. 3.이 세 가지 기술을 조합하여 사용할 수 있지만, 많은 폴리 ​​카운트를 표시했기 때문에 첫 번째를 언급했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.