2013-09-11 3 views
0

Конечная цель - визуализировать изображения произвольных размеров в JOGL и делать это быстро на основных графических картах.Отображение изображений JOGL

Моя первоначальная попытка состояла в том, чтобы достичь этого, используя текстуры. Однако на некоторых графических картах я столкнулся с проблемами (точнее, графическими картами виртуальной машины).

Некоторые изображения превышают GL_MAX_TEXTURE_SIZE, и если карта не поддерживает текстуры, которые не являются сила двух (gl.isNPOTTextureAvailable())

Затем я следовал несколько (1, 2) образцы, которые используются glDrawPixels для визуализации изображения непосредственно.

gl.glBlendFunc (GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 
gl.glEnable (GL.GL_BLEND); 
gl.glColor3f (0.0f, 0.0f, 0.0f); 
gl.glRasterPos2i (10, 300); 
gl.glDrawPixels (dukeWidth, dukeHeight, 
       gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, 
       dukeRGBA); 

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

[1] https://today.java.net/pub/a/today/2003/09/11/jogl2d.html

[2] http://www.java-tips.org/other-api-tips/jogl/drawing-pixels-and-showing-the-effect-of-gldrawpixels-glcopypixels-and-glpix.htm

мне удалось решить изображение исчезающего проблемы путем замены glRasterPos2i с glWindowPos2d но опять же это приведет к другому problemn - glWindowPos2d поддерживается только с OpenGL 1.4 и мои виртуальные машины поддерживают только 1.1.

Что не так с моим подходом?

Должен ли я передавать изображения, не имеющие размера, путем заполнения текстур?

Должен ли я разбивать большие изображения на многие текстуры (например, на одеяло), чтобы максимальный размер текстуры не превышал? беспокоясь о производительности в этом случае.

Tried Mesa3D для обеспечения более высокой версии openGL, но не может скомпилировать его для окон. Рекомендуются ли какие-либо другие средства визуализации программного обеспечения? (ожидание поддержки Swiftshader)

+0

Все эти вещи, которые вы пытаетесь использовать, устарели! Переключитесь на современный OpenGL. –

+0

Btw, с Mesa у вас есть доступ к GL 3.2 –

+0

@MichaelIV - спасибо за ваш комментарий. Как бы вы визуализировали изображение с использованием современного OpenGL? Что касается Mesa, мне нужно будет скомпилировать Mesa для окон, которые я так и не смог сделать до сих пор. Это, похоже, ставит вопрос о том, следует ли мне это использовать или нет. Я просто хочу загрузить готовый драйвер/dll, и, похоже, нет места для его получения, что заставляет меня казаться, что мой подход широко не используется. – Leon

ответ

0

Мне удалось выяснить ответ на мой вопрос.

http://www.opengl.org/wiki/Raster_Position_And_Clipping

Как нарисовать glBitmap() или glDrawPixels() примитивов, которые имеют начальный glRasterPos() вне левого или нижнего края окна?

Когда растровое положение установлено за окном, оно часто выходит за пределы объема просмотра и впоследствии помечено как недействительное. Предоставление примитивов glBitmap и glDrawPixels не произойдет с недопустимой растровой позицией. Поскольку glBitmap/glDrawPixels производят пиксели вверх и справа от растрового положения, представляется невозможным рендеринг этого примитива типа, обрезанного левым и/или нижним краями окна.

Однако здесь часто используется трюк: установите растровое положение в допустимое значение внутри объема представления. Затем позвоните по телефону:

glBitmap (0, 0, 0, 0, xMove, yMove, NULL);

Это говорит OpenGL, чтобы визуализировать растровое изображение no-op, но перемещает текущее растровое положение (xMove, yMove). Ваше приложение будет снабжать (xMove, yMove) значениями, которые помещают растровое положение за пределы объема представления.Следуйте этому вызову с помощью glBitmap() или glDrawPixels(), чтобы сделать рендеринг, который вы хотите.