단위 선택 원을 병합하는 방법?


16

병합 된 원 선택 으로이 효과를 만드는 방법을 알고 싶습니다. 설명 할 이미지는 다음과 같습니다.

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

기본적 으로이 효과를 찾고 있습니다.

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

원의 병합 효과를 어떻게 얻을 수 있습니까? 이 효과에 관한 설명을 찾지 못했습니다. 텍스처를 투영하기 위해 데칼 시스템을 개발할 수 있지만 병합 효과를 만드는 방법을 모르겠습니다.

가능하면 순전히 쉐이더 솔루션을 찾고 있습니다.


"병합 효과"가 무엇을 의미하는지 설명해 주시겠습니까?
wondra

물론, 스크린 샷의 오른쪽 상단 문자를 보면 데칼이 서로 교차하지 않고 왼쪽에있는 두 개가 파란색 원을 넘어 병합됩니다. 효과를 보여주기 위해 새 스크린 샷을 추가했습니다.
MaT

쉐이더 솔루션을 고집합니까? 그렇지 않다면 마지막 그림에서 문제를 해결 한 것입니다.
wondra

마지막 스크린 샷은 내가 타겟팅하는 효과 만 보여줍니다. 최종 결과는 이전 스크린 샷과 같아야합니다.
MaT

1
그래, 나는 그들이 질감으로 메쉬 원을 동적으로 만들고 메쉬를 잘라 병합한다고 생각합니다. 또한 좋은 해결책이지만 효과가 더 제한적이라고 생각합니다.
MaT

답변:


8

당신이 할 수있는 몇 가지 트릭이 있습니다 :

Z 버퍼

다른 모든 객체를 렌더링 한 후 각 단위에 대해 최대 Z 값으로 더 작은 크기의 투명한 원을 렌더링합니다. 그런 다음 선택 원을지면에 데칼로 렌더링합니다. Z 순서로 아래에 있기 때문에 단위 아래에 있으면 버려집니다.

완전히 투명하다는 것은 원이 Z- 버퍼 (최대 Z 값) 에만 기록됨을 의미합니다 . 이제 데칼을 렌더링 할 때 Z 버퍼 값에 대해 테스트되고 테스트를 통과하면 렌더링됩니다 (원 외부에서만 발생)

원판

이전 접근 방식과 동일하지만 이번에는 스텐실 버퍼를 사용합니다. 일부 스텐실 값을 가진 단위에 대해 더 작은 원을 렌더링 한 다음 선택 데칼을 렌더링합니다. 스텐실 값을 가진 요소를 버리려면 스텐실을 설정하십시오.


Z- 버퍼 기술은 흥미롭지 만 첫 번째 투명한 원이 어떻게 그라운드 데칼을 클리핑 할 수 있는지 모르겠습니다.
MaT

0

예를 들어 다른 데칼과 교차가있는 경우 데칼 렌더링 픽셀 셰이더를 확인하여 픽셀을 죽일 수 있습니다. 이런 종류의 원형 데칼에는 매우 효율적입니다.


1
나는 당신이 당신의 대답에서 부분을 건너 뛰었다 고 가정합니다-모든 원의 위치와 반경을 쉐이더에 전달합니다.
크롬 스터, 모니카

@Krom OP가 솔루션에 관심을 표명하면 자세한 내용을 알려 드리겠습니다.
JarkkoL

0

지상에있는 파란색 원을 의미합니까?

더 똑똑한 방법이있을 수 있지만 내 솔루션을 예제로 고려하십시오. 원을 화면 크기의 별도의 빈 질감으로 렌더링합니다. 이 시점에서 원하는대로 혼합 할 수 있습니다. 필요에 따라 풀 컬러를 쓰거나 주어진 픽셀에 원이 존재하는 정보 만 쓸 수 있습니다. 그러나 Z 테스트 효과를 원하면 작성하는 각 픽셀에 대해 깊이 정보가 필요합니다.

이전 단계 후에 터 레인을 렌더링 할 때 픽셀 셰이더의 화면 좌표를 UV로 사용하여 이전에 만든 텍스처를 샘플링 할 수 있습니다. 이제 지형의 지정된 픽셀에서 원이 투영되거나 투영되지 않아야합니다. 그러나 이렇게하면 Z 테스트가 비활성화 된 것처럼 작동하므로 지형에서 원을 숨길 수 없습니다. 지형이 뒤에있는 원을 숨기려면 원을 지형 텍스처와 혼합하기 전에 깊이 테스트를 수행하십시오. 작은 바이어스를 사용하여 지형 아래에 약간 있지만 원을 렌더링하려는 원을 렌더링 할 수 있습니다.


편집 : 이제 병합 된 원의 효과를 얻으려면 다음을 수행하십시오. 별도의 질감으로 렌더링 할 때 새 원을 렌더링하려고 할 때 이미 원이 렌더링되어 있는지 확인해야합니다. (텍스처에 값이 있는지 확인하십시오) 그렇다면이 픽셀을 지우십시오. 이렇게하면 둘 이상의 원이 겹칠 때 "개요"효과가 나타납니다. 이것이 올바르게 작동하려면 테두리가 아닌 원 내부에 대해서만이 테스트를 수행해야합니다. 따라서 원을 렌더링 할 때 출력 텍스처에 특정 값을 쓰면 그것이 원 안에 있음을 나타냅니다. 그런 다음 내부 원에 아무것도 렌더링 할 필요가 없으며 잘해야합니다.

Edit2 : 간단한 빨강 / 녹색 예제 : 픽셀을 렌더링하기 전에이 픽셀이 아직 녹색이 아닌지 확인하십시오. 그렇다면 렌더링하지 마십시오. 이것은 트릭을 할 것입니다. 실제로 텍스처에 쓰는 동안 원의 외부 / 내부에는 빨강 / 녹색을 사용할 수 있으며 지형을 렌더링하는 동안 해당 값을 읽고 원하는 색상으로 변환 할 수 있습니다.

내 대답이 우연히 너무 추상적이라면 알려주세요.


나는 일반적인 아이디어를 얻었지만 당신이 말한 것처럼, 병합 된 원에 관해서는 약간 추상화해야합니다. :)
MaT

0

몇 가지 옵션이 있습니다. 일반적인 방법으로, 스텐실 버퍼는 예제에서 원이 겹치는 윤곽선과 같이 특정 도면을 마스크해야하는 경우 매우 유용합니다.

이 경우에는 스텐실 버퍼없이 쉽게 수행 할 수 있다고 생각합니다. 깊이 버퍼를 사용하여 원이 겹치는 윤곽선을 제거 할 수 있습니다. 아이디어는 원의 내부를 깊이 버퍼로 그린 다음 내부를보고 싶지 않기 때문에 윤곽선을 그립니다. 이렇게하면 다른 원과 겹치는 외곽선 부분이 깊이 테스트에 의해 제거됩니다.

유일한 경고는 깊이 싸움에주의해야한다는 것입니다. 작은 오프셋을 사용하여 윤곽이 실제로 내부 뒤에 있는지 확인하고 깊이 테스트로 제거 할 수 있습니다. 대안은을 사용하는 것 glPolygonOffset()입니다.

중심이 (x1, y1, z) 및 (x2, y2, z)에 xy 평면에 평행 한 두 개의 원이 있다고 가정 해 봅시다. 그리고 당신은 이러한 그리기 기능이 있습니다 :

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

그런 다음 그리기 순서 delta는 작은 오프셋으로 다음과 같이 보입니다 .

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

내 머리 꼭대기에서, 이러한 데칼이 디스크로 그려지면, 각 원이 서로 다른 원에 대해 교차하는지 테스트하고 교차점을 배열에 넣습니다. 그런 다음 교차점 안에 있지 않은 호를 그립니다. 그러나 이것은 셰이더 솔루션이 아닙니다.


그래, 나도 그것에 대해 생각했다 :) 당신이 말했듯이 그것은 셰이더 솔루션이 아니며 매우 일반적인 솔루션이 아닙니다. 그러나 감사합니다!
MaT

그건 꽤 모호한 설명입니다
Kromster 지원 모니카 말한다

0

여기서 스텐실 링을 원합니다. 첫 번째 패스는 원을 스텐실 버퍼로 렌더링합니다. 두 번째 패스 는 스텐실 버퍼 가 변경되지 않은 곳 에서 가시적 인 윤곽선을 렌더링합니다 . 두 번째 패스는 첫 번째 패스보다 큰 형상을 사용해야하며,이 경우 간단한 선형 스칼라이면 충분합니다.

여기에 외곽선을 그리는 데 필요한 솔루션 이 필요한 것 이상이지만 (그 쉐이더는 모든 메쉬 가장자리를 풀 쿼드로 바꿉니다) 원본 모델을 스텐실 버퍼로 그린 다음 더 큰 버전을 렌더링하는 다음 접근법을 따릅니다. 스텐실 버퍼는 여전히 0입니다.


감사! 따라서 보이는 부분을 먼저 그리는 대신 투명 원을 스텐실에 렌더링하는 것으로 시작해야합니다. 그러나 둥근 투명 원을 어떻게 렌더링합니까? 이미지의 일부를 스텐실로 렌더링하도록 제한 할 수 없습니다. 스텐실로 렌더링하면 모든 것이 그곳에갑니다.
Doodlemeat

그렇기 때문에 두 번째 패스 (표시 부분)의 크기가 더 커집니다. 따라서 스텐실 버퍼보다 ​​경계가 더 큽니다. 두 번째 단계에서 꼭짓점 스칼라를 적용하면됩니다 (개요 셰이더를 찾으십시오. 대부분 참조하는 간단한 스칼라를 사용합니다). 색상이 투명한 경우 스텐실 버퍼를 변경할 수도 없습니다. 이 경우 아마도 두 번째 텍스처 마스크가 필요하거나 원을 결정하기 위해 거리 계산을 할 수 있습니다. 코드를 제공하려면 몇 시간이 걸리고 Unity에 액세스해야합니다.
Draco18s는 더 이상

흠, 첫 번째 패스에서 스텐실 버퍼에 쓰기 위해 흑백 이미지를 갖는 것은 어떻습니까? 스텐실에서 검은 색은 0이되고 흰색은 1이됩니다. 가능합니까?
Doodlemeat

이것이 두 번째 텍스처 마스크의 의미입니다. 나는 그것이 효과가있을 것이라고 확신한다. 나는 24 시간 이상 가질 수없는 Unity를 내 앞에 두지 않고 실제로 확인할 수 없다.
Draco18s는 더 이상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.