2016-12-26 1 views
-1

OpenGL 프로그램에서 GUI 구성 요소를 렌더링하고 싶습니다. 그것들은 여전히 ​​단순한 텍스처링 (vbo) 직사각형입니다. 다음과 같은 일을 올바르게하고 싶습니다.GUI를위한 OpenGL 2d (직교) 렌더링, 현대적인 방법

  1. 화면 좌표를 사용하거나 최소한 원근감과 같은 부동 소수점을 기반으로하지 않는 좌표계를 사용하여 그리기. 예를 들어 좌표계는 -1f에서 1f (화면의 왼쪽에서 오른쪽)입니다. 화면/픽셀 좌표를 사용하는 것이 더 논리적 일 것입니다.
  2. 쉽게 할 수 있다면, 윈도우 (뷰포트) 크기가 조정될 때 GUI가 늘어나지 않게하고 싶습니다.

내가 알고 있듯이 이전에는 더 이상 사용되지 않는 기능 glOrtho을 사용하여 많은 작업을 수행 할 수있었습니다. 그러나 내가 현대적인 방식으로하고 싶기 때문에 성능 향상을 위해 잘하면 좋겠지 만, 어떻게 시작해야할지 모르겠다. 인터넷에서 검색 한 후 셰이더를 사용해야한다는 결론에 도달했습니다. 셰이더에 익숙하지 않습니다. 또 다른 질문 : 쉐이더를 사용하여 성능을 향상시킬 수 있습니까?

답변

1

현대식 OpenGL로하는 작업은 기본적으로 glOrtho를 사용하여 직교 투영 행렬을 설정하는 것과 같습니다. 좌표 1 : 1을 뷰포트 좌표로 매핑하고 좌표를 변환하는 데 사용하는 변환 (행렬)을 만듭니다.

예를 들어 vec2 균일화 viewport을 만들고 뷰포트 너비/높이로 설정할 수 있습니다. 그런 다음 버텍스 쉐이더에서이

gl_Position = vec4(2*vpos.xy/viewport.xy - 1, 0, 1); 
+0

한 수 물론 사전에 계산의'VEC2 (2) /viewport.xy처럼 정점 픽셀 범위 [-1,1]로 위치를 좌표 변환이 사용할 수 있습니다 '변환을 단순한 곱셈 - 덧셈으로 줄입니다. – derhass

+0

@derhass : 확실히. 그러나 나는이 문제에 접근하는 방법에 대한 일반적인 생각을 설명하고자했다. 또한 OpenGL 드라이버의 빌트인 GLSL 컴파일러가 'vec2 (2)/viewport.xy' 하위 작업을 감지하여 균일하게 만들고 최적화하면 놀라지 않을 것입니다. 아마도 SPIR-V 나 UBO가 사용 된 것은 아닙니다. – datenwolf

관련 문제