문제 상황
pointSize_를 어떻게 지정하던간에, 시각화되는 포인트의 크기가 1.0~1.4이라도 시각적으로 동일하게 보이고, 1.5~2.4도 동일해 보인다. 셰이더 안에서 point 크기를 다루어도 동일한 현상이 발생한다.
glPointSize(pointSize_);
glDrawArrays(GL_POINTS, 0, points.size());
공식 설명
glPointSize함수는 점의 래스터화 된 지름을 정한다고 한다. point size 모드가 비활성화된 경우 (`GL_PROGRAM_POINT_SIZE`를 사용하는 `glEnable` 참조) 이 값이 점을 래스터화 하는데 사용된다. 그렇지 않으면`glEnable(GL_PROGRAM_POINT_SIZE)` 인 경우, 셰이딩 언어 내장 변수 `gl_PointSize`가 사용된다,
- 래스터화된 지름: 화면의 픽셀 그리드 위에서 실제로 몇 픽셀을 차지하는지
GL_POINT_SIZE로 조회하면 항상 glPointSize로 지정한 값이 그대로 반환된다. 클램프/라운딩은 지정값(query)에 영향을 안 준다고 작성되어있는데, 이게 무엇에 대한 클램프, 라운딩 지정값을 의미하는지는 아직 이해하지 못했다. 다만 대충의 느낌은 glPointSize를 1.0, 1.1, 1.2, 1.3으로 주던 말던 GPU는 가능한 값으로 클램프해서 렌더링 요구를 만족하는 것 같다. 그래서 소수점 마다마다의 size가 정확히 지정이 안됨.
그리고 OpenGL 2.1 문서의 경우에 적힌 내용이긴 하지만, point의 안티 앨리어싱이 활성화된 경우 모든 크기가 지원되는 것이 아니라고 한다. 지원되지 않는 크기를 요청하면, 가장 가까원 지원되는 크기가 사용된다. 최소 크기 1만 지원이 보장되며 다른 크기는 구현에 따라 다르다고 한다. 지원되는 크기 범위와 범위 내 지원 크기 간의 차이를 확인하려면 `glGet` 함수를 통해 `GL_SMOOTH_POINT_SIZE_RANGE`, `GL_SMOOTH_POINT_SIZE_GRANULARITY`를 매개변수로 넣고 호출하여 확인할 수 있다고 한다. (하지만, 이렇게 받아온 정보값을 통해 구현해도 정확하진 않다. OpenGL을 Qt환경에서 써서 그런진 모르겠지만..)
스택 오버플로우
원하는 점의 크기가 허용 범위에 속하지 않으면, 텍스처가 적용된 사각형이나 TRIANGLE_FAN을 사용하여 원하는 크기의 원형 다각형을 만드는 것을 고려하는 것도 방법이다.
참고 자료
- https://registry.khronos.org/OpenGL-Refpages/gl2.1/xhtml/glPointSize.xml
- https://registry.khronos.org/OpenGL-Refpages/gl4/html/glPointSize.xhtml
- https://stackoverflow.com/questions/11414713/opengl-gl-points-size
'Computer Graphics > OpenGL' 카테고리의 다른 글
| [OpenGL, SPDLOG] SPDLOG의 'formatting of non-void pointers is disallowed' (0) | 2025.04.22 |
|---|