3D 엔진에서 활성 윤곽선, 선택한 3D 캐릭터 또는 화면의 풍경에 대한 강조 효과를 설정하려고합니다. 스텐실 버퍼로 작업하고 만족스럽지 않은 결과 (모양이 오목한 모양, 카메라와의 거리로 인한 윤곽 두께 및 데스크탑과 랩톱 간 불일치)가 발생한 후 가장자리 감지 및 프레임 버퍼 샘플링으로 전환하여 윤곽선을 얻었습니다. 꽤 만족합니다.
그러나 선택한 메쉬가 다른 메쉬 뒤에 있으면 윤곽선을 숨길 수 없습니다. 나머지 장면을 렌더링 한 후 프레임 버퍼에서 2d 셰이더 외곽선을 간단히 렌더링하기 때문에 프로세스에 따라 의미가 있습니다.
내 결과의 두 화면 캡처는 다음과 같습니다. 첫 번째는 "양호한"아웃 라인이고, 두 번째는 아웃 라인 소스를 차단하는 메시에서 아웃 라인이 보이는 곳입니다.
렌더링 프로세스는 다음과 같이 실행됩니다. 1) 강조 표시된 메쉬의 알파 만 그려서 프레임 버퍼 (framebuffer1)에 검은 색 실루엣을 캡처합니다.
2) 텍스처를 framebuffer1에서 가장자리 감지를 수행하는 두 번째 셰이더로 전달합니다. 프레임 버퍼 2의 가장자리를 캡처합니다.
3) 전체 장면을 렌더링합니다.
4) 장면 위에 framebuffer2에서 텍스처를 렌더링합니다.
나는 달성 방법에 대한 몇 가지 아이디어를 가지고 있으며, 그들의 유효성 또는 더 간단하거나 더 나은 방법에 대한 피드백을 받기를 희망합니다.
먼저 전체 장면을 프레임 버퍼로 렌더링하고 강조 표시된 메쉬의 보이는 실루엣을 알파 채널에 저장했습니다 (강조 표시된 메쉬가 보이는 곳에 모두 흰색 저장). 그런 다음 알파 채널에서 가장자리 감지를 수행하고 장면 프레임 버퍼를 렌더링 한 다음 가장자리를 맨 위에 렌더링합니다. 다음과 같은 결과가 발생합니다.
이를 위해 강조 표시된 객체의 렌더링 패스 중 정의 픽셀을 설정하여 알파로 보이는 모든 픽셀을 알파로 표시합니다.
두 번째 아이디어는 위에서 설명한 현재 렌더 프로세스를 사용하고 선택한 메쉬의 실루엣을 렌더링 할 때 framebuffer1의 R, G 및 B 채널에 X, Y 및 Z 좌표를 저장하는 것입니다. 가장자리 감지는 framebuffer2에 수행되고 저장되지만 RGB의 가장자리에서 실루엣까지 RGB / XYZ 값을 전달합니다. 그런 다음 장면을 렌더링 할 때 좌표가 framebuffer2에 저장된 가장자리 내에 있는지 테스트합니다. 그렇다면 현재 조각의 깊이를 테스트하여 RGB 채널에서 추출 된 좌표의 앞 또는 뒤에 있는지 확인합니다 (카메라 공간으로 변환). 조각이 깊이 좌표 앞에 있으면 조각이 정상적으로 렌더링됩니다. 조각이 뒤에 있으면 단색 외곽선 색상으로 렌더링됩니다.
이 프로젝트에 LibGDX를 사용하고 있으며 WebGL 및 OpenGL ES를 지원하려고하므로 지오메트리 쉐이더 또는 최신 GLSL 함수와 관련된 솔루션을 사용할 수 없습니다. 누군가 내가 제안한 접근법에 대해 의견을 말하거나 더 나은 것을 제안 할 수 있다면 정말 감사하겠습니다.