Антиалиасинг с мультисэмплингом в opengl 2.1?
У меня есть MacBook Pro 2007 года с видеокартой ATI Radeon X1600. Я пытаюсь заставить антиалиасинг работать с помощью функции мультисэмплинга.
Используя GlView, эта информация у меня под рукой:
Информация рендерера:
Рендерер: ATI Radeon X1600 OpenGL Engine Производитель: ATI Technologies Inc. Память: 128 МБ Версия: 2.1 ATI-7.0.52 Устройство: MacBookPro2,2 Версия языка шейдинга: 1.20
Я проверил информацию о расширении для arb_multisample и он говорит: "Повышен до основной функции в OpenGL 1.3", тогда правильно ли предположить, что в моем коде я могу просто сказать (как в Opengl 2.1):
glEnable(GL_MULTISAMPLE)
В моем коде приложения у меня есть структура данных, которая содержит следующую информацию: вершины, индексы и текстуры, которые я затем отображаю с помощью glDrawElements и т. Д. Также все они представляют собой треугольные сетки.
Код выглядит примерно так:
(capi:define-interface stad-viewer (capi:interface)
((double-buffered-p :initform t :initarg :double-buffered-p :accessor double-
buffered-p))
(:panes
(canvas opengl:opengl-pane
:configuration (list :rgba t :depth t :depth-buffer 32 :double-buffered t)
:min-width 1440
:min-height 900
:message "Stadium demo"
:drawing-mode :quality
:reader canvas
:resize-callback 'resize-stad-canvas
:display-callback 'redisplay-stad-canvas))
(:layouts
(main capi:column-layout '(canvas)))
(:default-initargs :auto-menus NIL :title "Stadium Viewer"))
;;; enable multisampling
(opengl:gl-enable opengl:*gl-multisample*)
(opengl:gl-sample-coverage 0.70 opengl:*gl-false*)
;;; some more opengl commands....
;;; rendering meshes
(dolist (wfmesh *wfmeshes*)
(format t " ------ PREPARING MESH ---- ~A ~% " (mesh-name wfmesh))
(multiple-value-bind (vertices indices)
(prepare-mesh wfmesh)
(let* ((gl-vertices (gl-vertexes vertices))
(gl-indices (gl-indexes indices)))
(if *texture-ids*
(multiple-value-bind (texture-id found)
(gethash (mesh-name wfmesh) *texture-ids*)
(when found
(opengl:gl-bind-texture opengl:*gl-texture-2d* texture-id)
(opengl:gl-tex-coord-pointer 2 opengl:*gl-float* 0
(gl-texels (mesh-vertices wfmesh)
1.0 t)))))
(opengl:gl-vertex-pointer 3 opengl:*gl-float* 0 gl-vertices)
(opengl:gl-draw-elements opengl:*gl-triangles*
(length indices)
opengl:*gl-unsigned-int*
gl-indices))))
Также я включил мультисэмплинг, как указано выше. Однако вот что я получаю:
Зубчатые края хорошо видны.
Итак, мои вопросы:
- Правильно ли я понимаю, что мультисэмплинг является основной функцией?
- Работает ли просто включение мультисэмплинга и вызова кода для рисования, или для работы мультисэмплинга требуются дополнительные шаги?
1 ответ
Вы используете Какао NSOpenGLView? Потому что тогда вы можете просто включить мультисэмплинг в Интерфейсном Разработчике. В любом случае вы должны создать свой контекст визуализации, в частности, с образцами буферов. В любом случае, glEnable(GL_MULTISAMPLE) недостаточно. Чтобы получить более конкретную помощь, вам нужно указать, как вы создаете окно / представление OpenGL.