병합 된 원 선택 으로이 효과를 만드는 방법을 알고 싶습니다. 설명 할 이미지는 다음과 같습니다.
기본적 으로이 효과를 찾고 있습니다.
원의 병합 효과를 어떻게 얻을 수 있습니까? 이 효과에 관한 설명을 찾지 못했습니다. 텍스처를 투영하기 위해 데칼 시스템을 개발할 수 있지만 병합 효과를 만드는 방법을 모르겠습니다.
가능하면 순전히 쉐이더 솔루션을 찾고 있습니다.
병합 된 원 선택 으로이 효과를 만드는 방법을 알고 싶습니다. 설명 할 이미지는 다음과 같습니다.
기본적 으로이 효과를 찾고 있습니다.
원의 병합 효과를 어떻게 얻을 수 있습니까? 이 효과에 관한 설명을 찾지 못했습니다. 텍스처를 투영하기 위해 데칼 시스템을 개발할 수 있지만 병합 효과를 만드는 방법을 모르겠습니다.
가능하면 순전히 쉐이더 솔루션을 찾고 있습니다.
답변:
당신이 할 수있는 몇 가지 트릭이 있습니다 :
Z 버퍼
다른 모든 객체를 렌더링 한 후 각 단위에 대해 최대 Z 값으로 더 작은 크기의 투명한 원을 렌더링합니다. 그런 다음 선택 원을지면에 데칼로 렌더링합니다. Z 순서로 아래에 있기 때문에 단위 아래에 있으면 버려집니다.
완전히 투명하다는 것은 원이 Z- 버퍼 (최대 Z 값) 에만 기록됨을 의미합니다 . 이제 데칼을 렌더링 할 때 Z 버퍼 값에 대해 테스트되고 테스트를 통과하면 렌더링됩니다 (원 외부에서만 발생)
원판
이전 접근 방식과 동일하지만 이번에는 스텐실 버퍼를 사용합니다. 일부 스텐실 값을 가진 단위에 대해 더 작은 원을 렌더링 한 다음 선택 데칼을 렌더링합니다. 스텐실 값을 가진 요소를 버리려면 스텐실을 설정하십시오.
예를 들어 다른 데칼과 교차가있는 경우 데칼 렌더링 픽셀 셰이더를 확인하여 픽셀을 죽일 수 있습니다. 이런 종류의 원형 데칼에는 매우 효율적입니다.
지상에있는 파란색 원을 의미합니까?
더 똑똑한 방법이있을 수 있지만 내 솔루션을 예제로 고려하십시오. 원을 화면 크기의 별도의 빈 질감으로 렌더링합니다. 이 시점에서 원하는대로 혼합 할 수 있습니다. 필요에 따라 풀 컬러를 쓰거나 주어진 픽셀에 원이 존재하는 정보 만 쓸 수 있습니다. 그러나 Z 테스트 효과를 원하면 작성하는 각 픽셀에 대해 깊이 정보가 필요합니다.
이전 단계 후에 터 레인을 렌더링 할 때 픽셀 셰이더의 화면 좌표를 UV로 사용하여 이전에 만든 텍스처를 샘플링 할 수 있습니다. 이제 지형의 지정된 픽셀에서 원이 투영되거나 투영되지 않아야합니다. 그러나 이렇게하면 Z 테스트가 비활성화 된 것처럼 작동하므로 지형에서 원을 숨길 수 없습니다. 지형이 뒤에있는 원을 숨기려면 원을 지형 텍스처와 혼합하기 전에 깊이 테스트를 수행하십시오. 작은 바이어스를 사용하여 지형 아래에 약간 있지만 원을 렌더링하려는 원을 렌더링 할 수 있습니다.
편집 : 이제 병합 된 원의 효과를 얻으려면 다음을 수행하십시오. 별도의 질감으로 렌더링 할 때 새 원을 렌더링하려고 할 때 이미 원이 렌더링되어 있는지 확인해야합니다. (텍스처에 값이 있는지 확인하십시오) 그렇다면이 픽셀을 지우십시오. 이렇게하면 둘 이상의 원이 겹칠 때 "개요"효과가 나타납니다. 이것이 올바르게 작동하려면 테두리가 아닌 원 내부에 대해서만이 테스트를 수행해야합니다. 따라서 원을 렌더링 할 때 출력 텍스처에 특정 값을 쓰면 그것이 원 안에 있음을 나타냅니다. 그런 다음 내부 원에 아무것도 렌더링 할 필요가 없으며 잘해야합니다.
Edit2 : 간단한 빨강 / 녹색 예제 : 픽셀을 렌더링하기 전에이 픽셀이 아직 녹색이 아닌지 확인하십시오. 그렇다면 렌더링하지 마십시오. 이것은 트릭을 할 것입니다. 실제로 텍스처에 쓰는 동안 원의 외부 / 내부에는 빨강 / 녹색을 사용할 수 있으며 지형을 렌더링하는 동안 해당 값을 읽고 원하는 색상으로 변환 할 수 있습니다.
내 대답이 우연히 너무 추상적이라면 알려주세요.
몇 가지 옵션이 있습니다. 일반적인 방법으로, 스텐실 버퍼는 예제에서 원이 겹치는 윤곽선과 같이 특정 도면을 마스크해야하는 경우 매우 유용합니다.
이 경우에는 스텐실 버퍼없이 쉽게 수행 할 수 있다고 생각합니다. 깊이 버퍼를 사용하여 원이 겹치는 윤곽선을 제거 할 수 있습니다. 아이디어는 원의 내부를 깊이 버퍼로 그린 다음 내부를보고 싶지 않기 때문에 윤곽선을 그립니다. 이렇게하면 다른 원과 겹치는 외곽선 부분이 깊이 테스트에 의해 제거됩니다.
유일한 경고는 깊이 싸움에주의해야한다는 것입니다. 작은 오프셋을 사용하여 윤곽이 실제로 내부 뒤에 있는지 확인하고 깊이 테스트로 제거 할 수 있습니다. 대안은을 사용하는 것 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입니다.