2014-12-18 4 views
0

다음과 같은 문제가 있습니다. 점 집합이 포함 된 OpenGL을 사용하여 2D 장면을 그립니다. 각 포인트는 XY 좌표로 지정됩니다. 포인트를 렌더링하기 위해 삼각형, 십자형 또는 쿼드와 같은 마커 심볼을 사용하고 싶습니다. 문제는 장면을 확대 할 때 마커 크기가 화면 상에 일정해야한다는 것입니다. 예를 들어 GL_POINTS을 사용하는 것과 같습니다. 그래서 스케일을 변경할 때마다 마커 좌표를 다시 계산해야합니다. 이것은 편리하지 않습니다. 새로운 렌더링 포인트 위치를 얻었을 때 한 번하고 싶습니다. 어떤 문제가 있습니까?OpenGL 2D 마커 기호

답변

1

아마도 가장 쉬운 방법은 심볼로 텍스처를 가지고 포인트 스프라이트로 그리는 것입니다.

Render large circular points in modern OpenGL

마음에 오는 또 다른 방법은 모든 후 버텍스 쉐이더 에서 지오메트리의 스케일링을 적용한다는 것입니다 : 당신이 그 방법으로 도움이 필요한 경우, 내 대답은 여기에 포인트 스프라이트를 사용하는 방법에 대해 설명합니다 투영을 포함한 다른 변환이 적용되었습니다.

  • 있는 마커의 모든 꼭지점에 대해 동일한 값 마커의 중심 :

    마음에 오는 것을 가장은 즉시 버텍스 쉐이더로 각 정점에 대한 두 가지 속성을 통과한다는 것입니다.

  • 마커의 중심으로부터의 상대 오프셋.

그런 다음 버텍스 쉐이더에서, 당신은과 중앙에만에 투영 변환, 을 포함한 모든 일반적인 변환을 적용 할 수 있습니다. 그런 다음 상대 오프셋을 추가합니다.

버텍스 쉐이더를 스케치, 그것은 다음과 같을 수 있습니다 : 오프셋 상대가 투사 한 후 적용되기 때문에

in vec3 centerPos; 
in vec2 relativePos; 
uniform mat4 ModelViewProj; 
... 

void main() { 
    ... 
    vec4 projCenterPos = ModelViewProj * vec4(centerPos, 1.0); 
    gl_Position = vec4(
     projCenterPos.xy + projCenterPos.w * relativePos, 
     projCenterPos.zw); 
} 

, 당신은 y 우리가 지금 동차 좌표가 계정 x 고려해야 , z은 정점 셰이더 이후의 고정 함수 처리의 일부로 w으로 나뉩니다. 이 원근법 나누기 후에 크기를 일정하게 만들려면 위 코드에서 오프셋에 w을 곱합니다.

기본적으로 relativePos은 x 방향 및 y 방향의 범위가 [-1.0, 1.0] 인 NDC (Normalized Device Coordinates)에 적용되므로 값은 상당히 작아야합니다. 예를 들어 0.02의 오프셋은 창 크기의 1 %에 해당합니다.

크기 조정을보다 유연하게하려면 다른 배율 인수를 전달하여 스프라이트 크기를 제어하고 relativePos에 위 계산의 계수를 곱하십시오. 그런 다음 상대 위치를 유지할 수 있습니다. [-1.0, 1.0]의 범위 내에서 적절히 크기를 조정하십시오.

... 
uniform float spriteSize; 
... 

    gl_Position = vec4(
     projCenterPos.xy + spriteSize * projCenterPos.w * relativePos, 
     projCenterPos.zw); 
+0

답장을 보내 주셔서 감사합니다. –