2014-10-14 1 views
0

필자는 정확하게 그려야 할 분산 그래프 데이터를 가지고 있습니다. 실제 데이터는 데이터 격자입니다.데이터를 정확하게 (선없이) 텍스처 또는 오르토 프로젝션 또는 다른 것으로 플로팅 하시겠습니까?

모든 그래프 데이터를 vbo에 넣고 점으로 그리면 데이터 포인트 사이에 선이 생깁니다.

화면 공간으로의 변환과 관련이 있다고 생각합니다. 그러므로 나는 투영 행렬을 적용 할 필요가있다.

임 내가 직교 투사를 원하지만 현재 내 직교 행렬 생성에 버그를 갖고있는 것 같다 확인 :

void OrthoMatrix(float[] matrix, float left, float right, float top, float bottom, float near, float far) 
     { 
      float r_l = right - left; 
      float t_b = top - bottom; 
      float f_n = far - near; 
      float tx = - (right + left)/(right - left); 
      float ty = - (top + bottom)/(top - bottom); 
      float tz = - (far + near)/(far - near); 

      matrix[0] = 2.0f/r_l; 
      matrix[1] = 0.0f; 
      matrix[2] = 0.0f; 
      matrix[3] = tx; 

      matrix[4] = 0.0f; 
      matrix[5] = 2.0f/t_b; 
      matrix[6] = 0.0f; 
      matrix[7] = ty; 

      matrix[8] = 0.0f; 
      matrix[9] = 0.0f; 
      matrix[10] = 2.0f/f_n; 
      matrix[11] = tz; 

      matrix[12] = 0.0f; 
      matrix[13] = 0.0f; 
      matrix[14] = 0.0f; 
      matrix[15] = 1.0f; 
     } 

하지만 그것을 밖으로 작동하지 않을 수 있습니다. 내 쉐이더는 다음과 같습니다.

gl_Position = projectionMatrix * vec4 (위치, 0, 1.0); enter image description here

동료 :

내 데이터 (서브 세트)

-15.9 -9.6 
-15.8 -9.6 
-15.7 -9.6 
-15.6 -9.6 
-16.4 -9.5 
-16.3 -9.5 
-16.2 -9.5 
-16.1 -9.5 
-16 -9.5 
-15.9 -9.5 

좌측의 이미지 올바른 (그러나 라인) 및 우측 이미지처럼 플롯은 오르토 함께 처음에는 데이터를 플롯 영역을 따르는 비트 맵에 넣고로드하는 것이 좋습니다. 어떤 정도는 어느 정도 이해가되지만 그것은 한 걸음 뒤로 향하는 것처럼 보입니다. 특히 이미지가 여전히 "뻗어"있고 현실에서 우리는 그 틈을 채우고 있습니다.

편집 glm.net을 사용하여 절벽 투영을 시도했는데 정확히 원하는 방식으로 작동합니다.

절두체 기능은 오르토와 비슷한 매개 변수를 사용하는 것처럼 보입니다. 나는 그 시간에 가서 투영 매트릭스에 대해 조금 더 읽었다 고 생각합니다!

누군가 내가 이상한 이미지를 설명 할 수 있다면 (오르토) 환상적 일 것입니다.

편집 2 이제 확대/축소를 추가하고 있습니다. 동일한 줄을보고 있습니다. 쿼드로 그려야하거나 포인트 크기를 줌 레벨에 매핑해야합니다.

+1

외모에 의해 수동으로 작성된 직교 투영 행렬이 전치됩니다. OpenGL은 열 주요 인덱싱을 사용하지만 매트릭스는 행 인덱스로 인덱싱됩니다. 그것은 또한 당신의 "ortho"투영의 이상한 외모를 설명 할 것입니다. – datenwolf

답변

1

실제로 보이는 "선들"은 실제로 데이터 표본 위치가 픽셀 격자로 강제 변환되는 아티팩트이며 물론 반올림 단계가 포함됩니다. OpenGL은 픽셀 중심이 뷰포트 좌표에서 (즉, NDC와 뷰포트 매핑 이후) x + 0.5에 있다고 가정합니다.

이 줄을 제거하는 유일한 방법은 점이 뷰포트 공간에 매핑되는 해상도를 높이는 것입니다. 하지만 뷰포트에는 많은 픽셀 만 포함되어 있으므로 무엇을 할 수 있습니까? 답변은 "수퍼 샘플링"또는 "멀티 샘플링"입니다. 즉 픽셀 당 여러 개의 샘플이 있고이 샘플 포인트의 범위가 래스터 화 가중치를 변조합니다. 자네가이 두려움을 두려워하면 두려워하지 마라. "손으로"구현하는 것이 효율적 일 수는 있지만 확실하지는 않습니다. 대부분의 (모든) 최신 GPU는 보통 멀티 샘플링에 대한 일종의 지원을 제공하며 대개 "안티 앨리어싱"으로 광고됩니다.

전체 화면 앤티 앨리어싱을 지원하는 OpenGL 컨텍스트를 만들고 멀티 샘플링을 활성화하고 그리드 주파수 비트 인공물 (앨리어싱)이 사라지는 것을 확인하십시오.

+0

샘플링은 데이터를 먼저 텍스처에 넣음으로써 수행 될 수도 있습니다. 앤티 앨리어싱을 사용하여 데이터를 오염시키지 않으려면 그렇지 않습니다. 아마도 갭에 매핑 된 크기가 증가하면 포인트가 작동할까요? 그것은 뷰포트 공간의 의미입니까? 이 경우 데이터의 갭을 일치 시켜서 해결할 수 있습니까? 나중에 포인트가 겹치기를 원하지 않습니다. 나중에 특정 색상을 갖게 될 것입니다. 아니면 어떻게 그려야할까요? 삼각형 목록을 사용하고 평면 음영을 사용합니까? – chrispepper1989

+0

내가 깜빡했는데 이제는 선이 더 균일 해졌기 때문에 "틈새를 메우는"것에 덜 신경을 쓴다 (투영 행렬 덕분에). – chrispepper1989

+0

@ chrispepper1989 : OpenGL "포인트"와 픽셀 사이에는 근본적인 차이점이 있습니다. 점은 기하학적 인 프리미티브이며, 래스터 화 된 값은 OpenGL 구현에 따라 실제로 조정될 수 있습니다. 명세는 주어진 오퍼레이션 체인이 항상 동일한 결과를 픽셀로 이끌어내는 한, 정확한 결과에서 약간의 여유를 구현한다. 하지만 두 개의 별개 OpenGL 구현은 실제로 상당히 다를 수 있습니다. 결국 당신이 달성하고자하는 것은 무엇입니까? – datenwolf

관련 문제