메시가 숨겨져있을 때 / 위치 후 처리 된 메시 아웃 라인을 숨기는 방법


10

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 함수와 관련된 솔루션을 사용할 수 없습니다. 누군가 내가 제안한 접근법에 대해 의견을 말하거나 더 나은 것을 제안 할 수 있다면 정말 감사하겠습니다.


당신의 레포를 보았습니다. 수용 가능한 해결 방법을 찾은 적이 있습니까?
iKlsR

답변:


0

비트를 설정하고 비트를 버리고 제거하기 위해 원하는 윤곽선이있는 객체가있는 스텐실 버퍼로 전체 장면을 렌더링합니다.

그런 다음 에지 감지를 제거하고 필요하지 않습니다. 대신 버퍼를 약간 확장 할 수 있습니다. 따라서 각 개체는 약간 자랍니다.

거기에서 스텐실 버퍼는 필요한 개요를 가질 수 있습니다. 렌더링하는 다른 객체가 스텐실 버퍼의 비트를 끄는 것입니다.


2
답장을 보내 주셔서 감사합니다. 스케일링이 3D로 수행되면이 방법이 외곽선 두께 및 오목한 모양과 비슷한 문제가 발생하지 않습니까? 또는 2d로 수행되고 윤곽이 설정된 객체가 화면의 중심에 있지 않으면 변위 문제가 있습니까?
NILS

0

1) 프레임 버퍼 객체에서 GPU에서 라플라시안 셰이더를 실행하여 윤곽을 얻을 수 있습니다.

2) FBO에서 객체를 그릴 때 최종 깊이 버퍼를 사용해야합니다. 이렇게하면 FBO에서 객체의 보이는 부분 만 그릴 수 있으며 라플라시안은 보이는 부분 만 윤곽을 그립니다.


안녕, 답변 주셔서 감사합니다. 나는 이미 내가 가지고있는 개요를 달성하기 위해 이것을하고 있습니다. 나는 당신 이이 대답에 대한 공감대를 가질 자격이 없다고 생각합니다.
nils

0

나는 이것을 분명히 할 수 있기를 희망하지만 기본적으로 두 객체가 모두 선택된 것처럼 두 개의 스텐실을 만든 다음 실제로 강조 표시하려는 항목의 경계 상자에만 영역을 유지해야합니다.

따라서 기본적으로 두 객체 (또는 객체를 폐쇄하는 모든 객체)의 하나의 스텐실 버퍼를 만들지 만 실제로는 많이 나오지 않는 한 그러한 경우에 대해 걱정하지 않습니다. 폐쇄 된 사람들이 기대하지 않을 경우 이 많은 도움이 필요합니다) 그리고 개체의 경계 상자 스텐실이 있습니다.

원하는 효과를 얻을 수 있습니다.

또는 '나쁜'결과를 남길 수 있으며 대부분의 사람들이 너무 신경 쓰지 않을 것이라고 생각합니다.하지만 이것은 데이터 / 게임 및 특히 객체의 크기에 따라 다릅니다.

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