Сглаживание с мультисэмплингом в 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. Правильно ли я понимаю, что мультисэмплинг является основной функцией?
  2. Работает ли просто включение мультисэмплинга и вызов кода отрисовки или требуется еще несколько шагов, чтобы мультисэмплинг заработал?

person 3d-indiana-jones    schedule 26.04.2012    source источник


Ответы (1)


Вы используете Cocoa NSOpenGLView? Потому что тогда вы можете просто включить мультисэмплинг в Interface Builder. В любом случае вы должны создать свой контекст рендеринга именно с буферами сэмплов. В любом случае glEnable(GL_MULTISAMPLE) недостаточно. Чтобы получить более конкретную помощь, вам нужно указать, как вы создаете свое окно/представление OpenGL.

person Kristian Duske    schedule 26.04.2012
comment
На самом деле я использую Lispworks с их интерфейсом ffi для opengl. Инструментарий Lispworks GUI (CAPI) имеет специальную панель opengl. Итак, из того, что вы упомянули, я полагаю, что мне нужно выяснить, как создать контекст opengl с примерами буферов. - person 3d-indiana-jones; 26.04.2012
comment
Обновил вопрос с фактическим кодом. часть capi-define-interface — это место, где создается окно с панелью opengl. остальное — это то, что включает мультисэмплинг, а затем рендеринг мешей. Извините, я не опубликовал фактический код и не предоставил тот факт, что я использую lisp. - person 3d-indiana-jones; 26.04.2012
comment
Я не знаю lisp или Lispworks, но я думаю, что вам придется добавить больше параметров в свой список конфигурации при создании панели OpenGL. На самом деле все зависит от выбора соответствующего формата пикселей, поддерживающего мультисэмплинг. Этот пример предназначен для Windows, но он объясняет, как мультисэмплинг зависит от формата пикселей. - person Kristian Duske; 26.04.2012
comment
ФИКСИРОВАННЫЙ. Спасибо @Кристиан. Мне пришлось передать NSOpenGLPFASampleBuffers и NSOpenGLPFASamples. Теперь никаких неровных краев. - person 3d-indiana-jones; 26.04.2012