2009-05-07 8 views
1

OpenGL에서 다소 복잡한 멀티 세그먼트 선을 그리려하고 있습니다. 그러나 라인이 두께가 약 3 이상이면 세그먼트 사이의 조인이 매끄럽지 않다는 것을 알게되었습니다. 때로는 그들 사이에 간격이 있습니다. 이러한 조인을 부드럽고 멍청하게 만드는 좋은 방법이 있습니까? Java에서 BasicStroke.JOIN_MITER에 해당하는 것과 비슷한 것을 찾고있다.OpenGL에서 매끄러운 선

+0

이것이 실제로 JOGL 인 경우 자바 태그를 추가하면 관련성이 높아져 더 많은 의견을 얻을 수 있습니다. –

+0

스크린 샷을 추가 할 수 있습니까? –

+0

지금 당장 이미지를 게시 할 곳이 없습니다. – DJClayworth

답변

5

OpenGL을 사용하여 생각 라인을 그릴 수있는 가장 일관되고 이식 가능한 방법은 카메라 정렬 (그렇지 않으면 빌보드로 알기) 다각형을 사용하는 것입니다. OpenGL API의 다른 구현은 행의 끝점을 다르게 처리하며 GL_LINE_SMOOTH은 플랫폼에 따라 크게 다른 결과를 생성합니다. 일부 구현에서는 1보다 큰 두께의 선을 잘못 정의 된 것으로 간주합니다. glLineWidth 맨 페이지에 명시된 바와 같이 : [앤티 앨리어스 라인의 경우] 너비 1 만 지원 될 수 있습니다. 다른 것들은 구현에 의존한다.

즉,이 간단한 문제를 해결하기 위해 간단한 2 패스 해킹을 사용했습니다. 깊이 버퍼 glDepthMask (GL_FALSE)

    1. 안 쓰기는 원하는 두께의 라인
    2. 가 라인에서 같은 크기의 모든 라인의 종점에서 평활화 지점 그리기를 평활화 그린다.
    3. 이 glDepthMask (GL_TRUE)를 작성하기위한 깊이 버퍼를 다시 활성화
    (이 단계는 그러나 그것은 선이 만나는 지점을 완성하고 모든 것을 조금 부드럽게 보이게한다 격차를 채우기 위해 필요하지 않을 수 있음)

    또한 깊이 버퍼 설정으로 재생하고 싶을 수도 있습니다. 두 선이 배경과 알파 블렌드 된 픽셀에 대한 심도 테스트를 통과하지 못해서 선들 간의 "갭"이 생길 수 있습니다.

  • +0

    일부 렌더러에서 두꺼운 선은 한 방향으로 만 선을 연장하여 그려집니다. 이 경우 점은 선의 중심에 그려지지 않습니다. OpenGL이 실제로 이것을 잘 처리하지 못하는 것 같습니다. 폴리곤이 결국 가장 좋은 방법이 될 것이라고 생각합니다. – DJClayworth

    0

    각 끝의 두께를 반으로 줄입니다. 더 매끄러운 선이 아니라 더 매끄러운 선을 조인 하겠지만 '간격'을 제거해야합니다.

    1

    OpenGL 구현의 품질에 따라 결과가 다를 수 있습니다. 서로 다른 구현에서 부드러운 선에 대해 많은 차이점을 발견했습니다.

    얇은 다각형을 사용하는 것과 같이 선분을 그리려면 다른 전략을 사용하는 것이 좋습니다.

    +0

    얇은 폴리곤이 매력적이지만, 앤티 엘리 어싱과 스티 플을 사용할 수 있어야합니다. – DJClayworth

    +0

    폴리곤에 앤티 앨리어싱을 적용 할 수 있으며 glPolygonStipple이 존재합니다. –

    +0

    나는 그것을 몰랐다. 도움이 될 수도 있습니다. – DJClayworth

    1

    GL_LINE_SMOOTH로 앤티 앨리어싱을 사용하면 선이 약간 그려지는 방식이 변경됩니다. 시도해 볼 수 있습니다. 또한 블렌딩이 작동하도록 활성화해야합니다.

    가장 중요한 점은 얇은 직사각형을 사용하여 선을 그리는 방법의 모든 측면을 제어 할 수 없다는 것이므로 더 잘 작동 할 수 있으며 자신 만의 DrawThickLine 함수를 작성한 후에는 더 이상 작업 할 수 없습니다. ..

    +0

    나는 이미 GL_LINE_SMOOTH를 시도해 보았지만, 불행히도 그다지 좋지는 않은 결과를 준다. – DJClayworth

    +0

    또 다른 생각 - GL_POINTS와 GL_LINES를 그릴 수 있습니까? GL_POINT_SMOOTH를 사용했다면 점은 상자가 아닌 둥근 원으로 렌더링됩니다. – JPhi1618

    +0

    또 다른 좋은 아이디어이지만, 일부 렌더러는 한면에서만 확장하여 선을 더 두껍게 만듭니다. 두 점이 모두 두꺼울 때 점의 중심이 선에 있지 않습니다. – DJClayworth

    0

    부드럽게하려면 베 지어 곡선이나 다른 형태의 스플라인을 사용해야합니다. OpenGL에 내장되어 있지 않지만 웹 사이트는 example program to generate Bezier curves using OpenGL입니다.

    +0

    여기의 문제는 선의 곡률이 아니라 세그먼트의 끝이 직선 세그먼트라고해도 서로 대치되지 않는다는 것입니다. 프로그램이 여전히 OpenGL에 선 세그먼트를 보내는 것을 끝내고 우리가 시작한 곳으로 돌아 왔습니다. – DJClayworth

    +0

    Bletch. 나는 내 자신의 대답을 downvote 유혹 (3 평판을 잃고) ... –

    1

    쿼드를 그리고 텍스처 또는 프래그먼트 셰이더를 사용하여 점을 찍습니다. 프래그먼트 셰이더는 앤티 앨리어싱을 제공 할 수도 있습니다.

    관련 문제