Неполадки при съемке текстур OpenGL, которые не отображаются корректно на разных платформах - PullRequest
2 голосов
/ 26 мая 2010

Мне было поручено решить проблему, которая находится за пределами моей области знаний, и я надеялся, что смогу получить совет по устранению неполадок от кого-то более опытного в openGL (у меня очень мало опыта работы с openGL). Мы работаем над кроссплатформенным приложением, которое реализовано в общей реализации lisp под названием ccl. В этом приложении нам нужно отобразить некоторые 3D-объекты, которые отображают текст. На Mac весь текст отображается нормально, но на ПК вместо отображения текста отображается какая-то другая текстура. Сначала я подумал, что, возможно, на неправильную текстуру просто ссылались, поэтому я попытался изменить номер текстуры, но ни одна из текстур в списке не была текстом (или, если это была текстура, была искажена и не выглядела как текст). Я знаю, что эта проблема очень расплывчатая, и я не ищу кого-то, чтобы опубликовать решение, но мне было интересно, могут ли люди предложить места, где я мог бы попытаться найти решение этой проблемы.

Вот метод, который в итоге создает текстуру из файла (извините, код написан на lisp с использованием какао / кокотрона) также, когда я добавил операторы print для печати пикселей в ширину и пикселей в высоту, оба оказались степенными из 2 (512):

(defun CREATE-IMAGE-FROM-FILE (Filename &key Verbose Forced-Depth (Flip-Vertical t)) "
in:  Filename string-or-pathname, &key Verbose boolean, Forced-Depth int, 
out: Pixels byte-vector,
   Width Height Forced-Depth int; Has-Alpha boolean.
   Create an image buffer from <Filename>
   - File must be 32 bit ARGB compatible, e.g., .png with mask or 24 bit RGB."
(print "CREATE IMAGE FROM FILE")
(print Filename)
(when Verbose (format t "CREATE-IMAGE-FROM-FILE: ~A~%" Filename))
(let* ((Image-Representation (#/retain (ns-image-rep-from-file (native-string       (namestring (translate-logical-pathname Filename)))))))
;; should massage data: GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV for best performance
;; http://developer.apple.com/documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html
(when (%null-ptr-p Image-Representation)
  (format t "~%missing texture ~S" Filename)
  (return-from create-image-from-file))
;; do the OpenGL vertical image flip
(when Flip-Vertical
  (flip-vertical-buffer 
   (#/bitmapData Image-Representation) 
   (* (#/bytesPerRow Image-Representation) (#/pixelsHigh Image-Representation))
   (#/bytesPerRow Image-Representation)))
(print (#/pixelsWide Image-Representation))
(print (#/pixelsHigh Image-Representation))
(values 
 (#/bitmapData Image-Representation)
 (#/pixelsWide Image-Representation)
 (#/pixelsHigh Image-Representation)
 (#/bitsPerPixel Image-Representation)
 (#/hasAlpha Image-Representation)
 (#/bitmapFormat Image-Representation))))


(defmethod DISPLAY-VERTEX-ARRAYS ((Self string-shape))
  (glEnable gl_texture_2d)
  (cond
   ;; Color!
   ((color-vector Self)
    (glcolor3ubv (color-vector Self))
    (gltexenvi gl_texture_env gl_texture_env_mode gl_blend))
   ;; Black
   (t 
    (gltexenvi gl_texture_env gl_texture_env_mode gl_modulate)))
   (glbindtexture gl_texture_2d (texture (font Self)))
   (glInterleavedArrays GL_T2F_V3F (va-stride Self) (vertex-arrays Self))
   (glDrawArrays gl_quads 0 (va-elements-count Self)) 
   (gltexenvi gl_texture_env gl_texture_env_mode gl_modulate)
   (glDisable gl_texture_2d)
   ;; if color was use better reset to white? 
   (when (color-vector Self) (glColor3f 1.0 1.0 1.0)))

альтернативный текст http://www.freeimagehosting.net/uploads/e2eaeeca57.png

альтернативный текст http://www.freeimagehosting.net/uploads/0a84c32403.png

Ответы [ 4 ]

2 голосов
/ 31 мая 2010

Это выстрел в темноте, но шрифты, как правило, настраиваются рано, потому что без текста без удовольствия. Поэтому убедитесь, что первый вызов wglMakeCurrent предшествует glGenTextures, используемому для создания имени для текстуры шрифта.

В целом, хотя я когда-либо использовал OpenGL только из C ++, у меня было определенное количество странного поведения, которое мне пришлось отследить. Поэтому я предлагаю две вещи, которые я нашел полезными при работе с OpenGL довольно напрямую:

Во-первых, вставьте вызовы на glGetError в максимально возможном количестве мест. Помещать это после каждого отдельного вызова OpenGL - за исключением вызова wglMakeCurrent для деактивации текущего контекста, поскольку glGetError всегда возвращает ошибку без контекста - всегда хорошо.

Что-то простое, например assert(glGetError()==GL_NO_ERROR), является разумным началом (или выберите любой другой метод взлома отладчика, который в любом случае позволяет продолжить, чтобы увидеть, что произойдет дальше), и если вы проверите документы на glGetError, вы, вероятно, можете прийти с чем-то более полным.

Во-вторых, по крайней мере, в Windows, убедитесь, что вы всегда работаете с действующим текущим контекстом. Это особенно важно для вызовов glGenTextures, которые генерируют имена текстур.

assert(wglGetCurrentContext()) выполнит эту задачу здесь, в идеале перед каждым блоком вызовов OpenGL, за исключением, разумеется, любого вызова wglMakeCurrent, устанавливающего текущий контекст.

0 голосов
/ 03 июня 2010

Ким Рис на правильном пути. Можно сказать, что состояние текстур для блоков просачивается в рендеринг слов. Код, который вы разместили, не является источником проблемы. Вам нужно найти код, который фактически отображает блоки и слова, и убедиться, что текстура шрифта связана с использованием glBindTexture, прежде чем будет нарисовано слово polys. Теперь, отчасти это зависит от того, использует ли ваше приложение «сырой» OpenGL или использует библиотеку сверху для построения «графа сцены» и абстрагирования этих низкоуровневых деталей. Можете ли вы опубликовать больше информации о том, что вы используете?

CCL отлично! Я использовал его почти исключительно.

0 голосов
/ 03 июня 2010

Текст рисуется после рисования прямоугольников?

Для меня это меньше похоже на проблему с включением текстовой текстуры, чем на отключение прямоугольника.

0 голосов
/ 27 мая 2010

Вот мои 2 цента.

У меня возникли проблемы с текстурами странного размера. Когда поддерживается расширение ARB_texture_non_power_of_two, теоретически графическая система может управлять текстурой с размерами, не имеющими степени двух экстентов, но на самом деле это не происходит с любой комбинацией.

Я обнаружил, что на картах NVIDIA в ОС Windows 2D-текстуры, не имеющие экстентов, кратных 2, отображаются некорректно (скажем, 231x73), а с некоторыми другими картами NVIDIA не управляют текстурами с экстентами, не являющимися кратное 4 (возможно, драйвер, может быть, графическая карта, проблема пока неизвестна).

Итак, мой совет - изучить размеры текстур.

...