2012-07-07 2 views
6

우리는 iOS 드로잉 응용 프로그램을 가지고 있습니다. 현재 도면은 OpenGL ES 1.1로 구현됩니다. 베 지어 곡선과 같은 선을 부드럽게하기 위해 일부 알고리즘을 사용합니다. 따라서 터치 이벤트가 발생하면 알고리즘을 기반으로 한 일련의 터치 이벤트 포인트를 얻고 이러한 포인트를 그립니다. 또한 브러쉬 텍스처를 사용하여 포인트를보다 자연스럽게 보입니다.OpenGL ES 2.0 쉐이더가있는 매끄러운 텍스처 라인

OpenGL ES 2.0 쉐이더에서 이러한 알고리즘을 구현할 수 있는지 궁금합니다. 터치 포인트와 출력으로 만들어진 선을 그리기 위해 OpenGL 함수를 호출하는 것과 같은 것이 브러쉬 질감의 커브 렌더링을 부드럽게합니다.

enter image description here

점 P0, P1, ... P4 여기서 터치 이벤트와 적색 곡선상의 점이다 - 곡선의 이웃하는 두 점 사이의 거리가 더되지 않도록 출력 점 T를위한 이러한 공정으로는 1 픽셀보다 큽니다. 어떤 도움이 많이 감사합니다 Bézier curve - Wikipedia, the free encyclopedia

:

그리고 여기에 베 지어 알고리즘 설명과 함께 링크입니다. 감사합니다. .

+0

좀 더 구체적으로 기재 할 수 있습니까? 알고리즘이 무엇인지 모르는 경우 특정 알고리즘을 쉐이더에 구현할 수 있는지 여부를 말할 수 없습니다! – user1118321

+0

우리가 어떤 알고리즘을 사용하는지는 중요하지 않습니다. 여기서 중요한 것은 셰이더가 입력 지점보다 출력 지점이 더 많이 생성되어야한다는 것입니다. 내 질문을 편집하고 베 지어 알고리즘으로 예제를 추가했습니다. –

답변

6

버텍스 쉐이더 안에 새 버텍스를 생성 할 수 없습니다 (ES에는없는 쉐이더 셰이더에서 수행 할 수 있음). 출력 버텍스의 수는 입력 버텍스의 수와 항상 같습니다. 위치 (물론 특성은 물론) 만 변경할 수 있습니다.

그래서 충분히 부드러운 곡선을 보장하기에 충분한 정점으로 만들어진 선 스트립을 그려야합니다. 당신이 할 수있는 것은 곡선 파라메터 값 T를 1D 꼭지점 위치와 같이 항상 같은 줄무늬에 두는 것입니다. 셰이더에서이 입력 위치 (매개 변수 값)를 사용하여 DeCasteljau 알고리즘 (또는 무엇이든)을 사용하여 곡선의 실제 2D/3D 위치와 셰이더에 상수로 입력 한 점 P0 ~ P4를 계산합니다 (균일 변수 GLSL 용어로).

그러나 CPU에서 이러한 점을 계산하고이를 동적 VBO에 넣는 것 이상으로 실제로 구매할 수 있는지 확실하지 않습니다. 절약 할 수있는 점은 CPU에서 GPU 로의 커브 점 복사와 CPU에서의 계산이지만, 반면에 버텍스 쉐이더는 훨씬 더 복잡합니다. 더 나은 접근 방법 인 평가가 필요합니다. 컨트롤 포인트가 각 프레임을 변경하기 때문에 각 프레임의 커브 포인트를 계산해야하고 커브의 세부 묘사가 높으면 아이디어가 좋지 않을 수도 있습니다. 그러나 그렇지 않으면 나는 그것이 정말로 지불한다고 생각하지 않는다. 또한 런타임시 제어점/곡선 각도의 변화하는 수에 쉽게 적용 할 수없는 쉐이더도 있습니다.

하지만 다시 한번 5 개의 제어점을 넣고 GPU에 N 개의 커브 점을 생성 할 수는 없습니다. 버텍스 쉐이더는 항상 하나의 버텍스에서 작동하고 단일 버텍스를 생성합니다. 프래그먼트 셰이더는 항상 단일 프래그먼트 (즉, 아직 픽셀은 아니지만)에서 작동하고 단일 (또는 아예) 프래그먼트 .

+0

매우 포괄적 인 답변 주셔서 감사합니다! 코드를 명확하게하고 성능을 향상시킬 방법을 찾고있었습니다. 그러나, 내가 보는 바와 같이, 이것은 사실이 아닙니다. 그건 그렇고, 당신은 T를 나타내는 1D 라인을 지나가는 매우 흥미로운 접근 방법을 제안했습니다. 나는 그것을 생각할 것입니다. –

+0

물론 :) 나는 새로운 줄에서 글을 쓰려고 입력을 누른 다음 주석을 보냈다. 다시 한번 감사드립니다! –