2010-12-14 4 views
3

OpenGL에서 LED VU 미터와 비슷한 것을 그렸습니다.정확하게 픽셀 래스터에 맞지 않는 2D OpenGL 드로잉 라인

Animated vumeters

불행하게도, 내 도면 공간이 제한되어있는 경우, 나는 그것을 정확히 18 바 맞게해야한다 : 결과는 다음의 수직 막대에 같이 있어야한다. 3.6 픽셀 막대 사이에 간격이 생깁니다.

그릴 때, 간격이 2 픽셀 또는 1 픽셀이므로 줄 사이의 눈에 띄는 차이가 발생합니다. 나는 서브 픽셀 렌더링을 사용하고 어떤 종류의 앤티 앨리어싱을 사용하여 선을 "가짜"로 만드는 대신 모든 간격이 같은 너비로 표시되도록하는 솔루션을 찾고 있습니다.

이 지금까지

glEnable(GL_LINE_SMOOTH); 
glHint(GL_LINE_SMOOTH, GL_NICEST); 
for (int i = 0; i < 18; ++i) { 
      float bBottom = barBottom + i*3.6f; 
      glBegin(GL_LINES); 
      glLineWidth(2); 
      glVertex2f(bRight,bBottom); 
      glVertex2f(bLeft,bBottom); 
      glEnd(); 
} 
glDisable(GL_LINE_SMOOTH); 

불행하게도, 라인 스무딩 켜면 눈에 보이는 효과를 보이지 않았다 내 코드입니다. 어떤 제안?

+1

픽셀 값을 정수로 반올림합니다. –

+2

'GL_LINE_SMOOTH'는 모든 구현에서 지원되지 않습니다. 그리고 @Matt Ball 에선 선을 정수 픽셀로 반올림하고 경계선을 그리거나 꼭대기에 간격을 두어야한다고 동의합니다 (이 경우 약 10px). – gavinb

+0

+1 애니메이션의 경우 –

답변

0

OpenGl 컨텍스트에 대해 앤티 엘리 어싱을 활성화 할 수없는 경우 에뮬레이션을 수행 할 수 있습니다. 간단한 그래픽을 사용하면 쉽습니다. 10.6 픽셀의 직사각형을 그릴 필요가있을 때 그 색상과 중간 색상의 단일 픽셀 라인 (사각형 색상의 0.6 및 배경 색상의 0.4)을 사용하여 10 픽셀을 그립니다.

+1

모니터의 서브 픽셀 정렬에 따라 이것은 한 방향으로 만 작동하며 가장 가능성이 높습니다. OpenGL은 고품질의 벡터 그래픽과 같은 이런 종류의 작업에 정말로 유용하지 않습니다. 3D 테셀레이션 오브젝트의 삼각형을 화면에 밀어 넣는 것이 무엇보다도 중요합니다. – datenwolf

+0

"모니터의 서브 픽셀 정렬"에 대해 들어 본 적이 없습니까? – alxx

+0

LCD의 빨간색/녹색/파란색 점 각각의 레이아웃 - 같은 위치에 있지 않습니다. 주로 고품질 글꼴 앤티 앨리어싱 (ClearType 등)에 사용됩니다. – Kos

1

멀티 샘플링 (Multisampling specs)을 사용하십시오.

또한 블록을 렌더링 할 때 쿼드 (선이 아닌)를 사용합니다.

3

개의 아이디어 :

  1. 이 간극 및 폭이 모두 동일하도록 오프 대화면 텍스처 모든 막대를 그리고 다음 필요한 화면 위치 및 크기에 따라서 블럭 전송하도록 쌍 선형 필터링을 사용한다.

  2. 완전히 빛나는 막대를 모두 그 으려면 모양을 잘 나타내려면 아티스트를 얻고 각 막대의 위쪽에서 아래쪽으로 알파 채널이있는 검정색 사각형을 그려 이미지의 필요한 부분을 어둡게 만듭니다.

+0

+1. 쉽고 강력합니다. – alxx