2009-06-22 6 views
28

OpenGL 앱 (Qt를 사용하여 Debian의 C++로 개발)에 표시하려는 간단한 SVG 아트웍 (아이콘 및 글리프 종류)이 있습니다.중간 래스터를 사용하지 않고 OpenGL에서 SVG 표시

명백한 해결책은 ImageMagick 라이브러리를 사용하여 convert에 SVG를 래스터 이미지에 적용하고 텍스처를 적절한 폴리곤으로 매핑하거나 좋은 오래된 glDraw 픽셀을 사용하는 것입니다.

그러나 SVG를 OpenGL 호출 시퀀스로 직접 변환하고 OpenGL의 선, 다각형 등을 사용하여 렌더링하는 것이 있는지 궁금합니다. 누구든지이 일을 할 수있는 것을 압니까?

+2

hmm .. 베 지어 곡선이 관련되어있을 때 까다로운 문제. 두 기술이 서로를 멋지게 보완 해주는 솔루션을 보는 것이 좋을 것입니다. – SpliFF

+1

이 질문은 http://stackoverflow.com/questions/6287650/rendering-svg-with-opengl-and-opengl-es/ – Fizz

답변

12

Qt가 가능합니다.
QSvgRenderer 당신이 SVG 이외의 QGLWidget에 무엇을 그리려면 아마도 당신이 paintEvent() ABIT 주변에 바이올린해야합니다 SVG을하고 QGLWidget
그것의 그것을 이상 칠 수 있습니다.

+0

에 감사 드려요. 매우 흥미 롭습니다 (저 자신을 알아 차렸을 것입니다). 문서에서 QPainter-on-QGLWidget에 벡터 요소가 완전히 보존되는지 또는 일부 중간 래스터 화가 발생하는지 여부는 분명하지 않습니다. GLintercept/GLtrace를 사용하여 알아 내기가 쉬워야합니다. – timday

+0

QPainter는 일반적으로 어떤 래스터 화도하지 않습니다. SVG의 경우에는 시작해야 할 이유가 없습니다. – shoosh

+0

내 플랫폼 (간단한 수정, 작성자에게 보낸)에서 Qt4 응용 프로그램을 사용하도록 GLTrace를 얻은 후에 인상적인 gl * 호출을 사용하여 SVW가 GLWidget에 그려지는지 확인할 수 있습니다. Trolltech은 http://doc.trolltech.com/4.4/opengl-overpainting.html에서 2D 및 3D 세계를 결합한 좋은 예를 제공합니다. 추가 작업을 원한다면 SV 디스플레이 호출을 GL 디스플레이 목록에 캡처 할 수 있습니다 (성능을 향상시키는 유일한 이유가 있지만 문제가 발생하면 렌더링 된 비트 맵을 캐시 할 가능성이 더 높습니다). 대신). – timday

5

SVGL은이 문제를 해결하지만 수개월 동안 휴면 상태였습니다. 여전히 가치있는 코드를 찾을 수 있습니다.

+0

아래 "dru"로 언급 한 "sauvage"프로젝트가 후계자 인 것으로 보입니다. 같은 저자이지만 파이썬보다는 C++. – timday

2

Inkscape에는 유용한 내보내기 옵션이 있습니다. 여기에는 DXF, PovRay, EPS, PS (PostScript), XAML, 라텍스 및 ODG (OpenDocument Drawing)가 포함됩니다. 아마도 그 중 하나에 대한 변환기가 있으며 Inkscape를 중개자로 사용할 수 있습니다.

DXF는 이미 일반적인 3D 형식이므로 특히 가능성이 높은 후보입니다. assimp은 DXF를로드하기위한 좋은 후보입니다. 또한 거기에

+0

Inkscape에는 아직 SVG의 전체 구현이 없으므로 내보내기 옵션도 부분적이라고 생각합니다. – shoosh

+0

사실 내가 사용하고있는 모든 SVG는 Inkscape에서 만들어 졌으므로 모든 내용을 내보낼 수만 있다면 ... 문제 없습니다. – timday

+1

어쨌든 SVG보다 출력 형식이 더 제한 될 것입니다. DXF는 백만 년 된 것처럼, 자르기 표시 또는 복잡한 그라디언트를 지원하지 않습니다. – SpliFF

1

는 없음 지원하지만,이 문제에 대한 모든 솔루션은 특히 오히려 사소 SVG를 지원할 수 있기 때문에 내 대답은, 벡터 그래픽 일반적으로 wtih OpenGL을 표시 방법에 대한 설명을 것입니다

1

가능성으로 tkzinc 애니메이션 SVG (SMIL). 애니메이션에 관해서는 아무 말도 없었기 때문에 정적 인 SVG만을 내포하는 질문을 가정합니다. 2011

, 예술의 상태는 마크 킬 가드의 아기, 현재는 그 이름에서 이미 짐작으로 만 공급 업체 (엔비디아) 확장 NV_path_rendering이다. 거기에 자료가 많이 있습니다

할 수 있습니다 물론 부하 SVGs 및 https://www.youtube.com/watch?v=bCrohG6PJQE의. 또한 경로에 대한 PostScript 구문을 지원합니다.에서 시연 된대로 다른 OpenGL은 (3D) 물건 렌더링 경로를 혼합 할 수 있습니다 : https://www.youtube.com/watch?v=yZBXGLlmg2U

NV_path_rendering

  • https://www.youtube.com/watch?v=FVYl4o1rgIs
  • 는 사용할 장면 뒤에 구글의 라이브러리에 의존 라이브러리가 사용됩니다. (엔비디아는 2013 년 말과 2014 년에이 코드를 공헌했습니다.) 카이로 개발자 중 한 명은 인텔 직원 임에도 불구하고 카이로를 사용하려는 구체적인 노력을 아직 인식하고 있지는 않지만 http://lists.cairographics.org/archives/cairo/2013-March/024134.html을 좋아하는 것으로 보입니다. NV_path_rendering.

    벤더 지원 또는 학업 성취도가 훨씬 낮은 신생 업체는 현재 개발 및 유지 관리중인 NanoVG입니다. (https://github.com/memononen/nanovg) 시간이 지남에 따라 사라진 OpenGL을 통한 2D 라이브러리의 수를 감안할 때, 저의 겸허 한 견해로는 주요 공급 업체가 지원하지 않는 것을 사용하는 것이 좋습니다.

관련 문제