2014-07-21 2 views
0

포인트가 내부에 있는지 확인해야합니다. 우리의 모양이 원이라면 쉽게 할 수 있습니다 :포인트가 내부에 있는지 확인하는 방법은 무엇입니까?

highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); 
highp float dist = distance(center, textureCoordinateToUse); 
textureCoordinateToUse = textureCoordinate; 
if (dist < radius) { 
    ... 
} 

그러나 모양이 별, 육각형, 나선형 등일 경우 어떻게 될까요? 누군가 그것을 빨리 할 수있는 방법을 알고 있습니까? 알파 채널이있는 이미지를 도형으로 사용할 수 있습니까? 그것을하는 방법?

업데이트 : 지금 가장 좋은 옵션은 셰이더에 다른 텍스처를 전달하는 것입니다. 내가 어떻게 해? 이제 셰이더는 varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;의 두 가지 속성을가집니다. 그리고 셰이더 코드 내에서 알파 채널을 검사하기 위해 다른 텍스처를 전달하려고합니다.

업데이트 2 : 셰이더에 셰이프를로드하려고했습니다 (그렇게 생각합니다). 저는 GPUImage 프레임 워크를 사용하고 있습니다. 그래서 제 모양으로 sampler2D를 유니폼으로 설정하고 알파 채널을 확인하려고했습니다. 괜찮습니까? 내 iPhone 5의 경우 외관이 좋지만 성능은 어떻습니까?

+0

알고리즘 또는 기존 라이브러리에 대한 질문입니까? –

+0

@EliAlgranti 해결책에 대한 질문입니다. 나는 OpenGL에 대한 경험이 없지만 이것에 대한 튜토리얼을 찾을 수는 없다. 기존의 라이브러리는 없지만 알파 채널이있는 .png를 매트릭스로 변환 한 다음 특수 픽셀의 알파를 확인하는 방법이 있기를 바랍니다. –

+0

질문에있는 태그를 발견하여 좋은 답변을 드릴 수 없습니다.당신이 설명하는 문제는 다각형 (PIP) 문제로 알려져 있습니다. 이 이름을 사용하여 솔루션을 찾아보십시오. Wikipedia는이 문제를 해결하기위한 일반적인 알고리즘에 대한 자세한 정보와 설명을 제공합니다. (http://en.wikipedia.org/wiki/Point_in_polygon) –

답변

1

셰이더 루틴의 결과가 이미지이기 때문에 셰이더가 아무 것도주지 않습니다.

이미지 기반 접근법에서는 문제를 다시 정의해야합니다. 흰색과 회색 픽셀이 모양을 정의하고 검은 픽셀이 아무 것도 정의하지 않는 렌더링 된 모양으로 회색 음영 이미지가 있다고 가정 해 보겠습니다. 각 도형의 중심과 각 도형의 경계 원을 알아야합니다. 모양의 경계 원은 서로 교차하지 않아야합니다..

그런 다음 원을 경계로 먼저 포인트 전년도 도형 조사 할 수 있고, 두 번째을 엿에 의해 (이 프로브는 일부 모양 당신은 단지 당신이 교차 가리킬 경우 알 수 이미지에서 픽셀을 엿으로 인해 모양을 구별 할 필요가있다) 특정 픽셀. 두 프로브가 양수이면 포인트가 도형 안에 있습니다.

+0

좋아, 그게 내가 필요로하는 것이지만 셰이더에 렌더링 된 도형을 올바르게 전달하는 방법은 자습서가 있습니까? –

+0

쉐이더가 필요하지 않습니다. 이미지와 픽셀을 직접로드해야합니다. .Net을 사용하고 있다면 System.Drawing.Bitmap을 찾으십시오. –

+0

질문 태그를 보면 Obj-c입니다. –

1

원과 같은 분석 셰이프 표현을 사용할 수있는 경우 해당 셰이프를 설명하는 방정식 만 있으면됩니다.

미리 그린 모양이 있고 그것을 텍스처로 패킹 할 수 있다면 그렇게 할 수 있습니다. 객체를 직사각형 (전체 텍스처 이미지)으로 처리하고 원과 같은 직사각형 검사를 수행하고 해당 텍스처의 색상을 얻은 다음 색상 검사를 수행하면됩니다. 색상을 확인하는 것은 실제로 당신에게 달려 있습니다. 그것은 흑백 일 수 있으며, 알파 채널을 사용하십시오.

3D 모델과 같이 복잡한 그려진 개체가있는 경우 프레임 버퍼 개체에 그려지거나 다시 질감으로 사용하거나 모델에 직접 투영 할 수있는 모델 투영 (실루엣)을 가져와야합니다 장면을 스텐 슬과 같은 몇 가지 추가 버퍼를 사용하여 다시 조각 쉐이더에서 특정 값을 확인할 수 있습니다.

+0

이 회신에 몇 가지 정보를 추가하면 해결책이 다음과 같이 나올 수 있습니다. 1) 방정식 찾기 (2D, 3D)를 처리하는 모양을 결정합니다. 2) 계산이 완료되고, 화면에서 시작되는 모양 (X0와 Y0가 주어짐)을 알 수 있습니다. 3) 방정식을 사용하여 점이 내부인지 확인합니다. 당신은 모양의 영역을 안다. 다른 방법은 마스크를 사용하고 색상을 반전하는 것이지만 동적이 아니며 정적 이미지에만 사용됩니다. – AlfuryDB

+0

그래서 셰이더의 main() 메서드에 모양 텍스처를 전달하고 알파 채널을 확인해야합니까? 충분히 빠를 것입니까? 내 셰이프를 방정식으로 표현할 수 없습니다. –

+0

질문에 설명 된 것과 같은 결과를 얻고 싶다면 대답은 예입니다. –

1

임의의 다각형 모양 : 1. 삼각형 모양 (예 : Delaunay 삼각 측량 사용). 2. 모든 삼각형을 가리 키도록 확인하십시오. 그것은 사소한 일이다. 3. 원래 다각형 모양 주위의 경계 모양과 삼각형에 대한 공간 분할을 사용하여 성능을 향상시킵니다.

+0

내 모양은 임의의 다각형이 될 수 없습니다. 예 : 둥근 모서리가있는 정사각형. –

+1

그리고 어떻게 렌더링합니까? 정확히 임의의 다각형 모양 인 점 목록으로 변환해야합니다. 아마 당신이 원하는 모양 유형이 얼마나 많은지 궁금 할 것입니다. 숫자가 수백이면 가장 일반적인 방법을 사용해야합니다.이 경우에는 삼각형입니다. 둥근 모서리가있는 사각형과 사각형을 지원하려면 대수적 방법을 사용하십시오. –

+0

이름이없는 그런 모양조차도 지원해야합니다. :) 내가 어떻게 해? 벡터 모양의 * .psd가 있습니다. –