JOGL图像渲染

时间:2013-09-11 09:32:09

标签: java opengl textures jogl mesa

最终目标是能够在JOGL中渲染任意大小的图像,并在基本图形卡上快速完成。

我最初的尝试是使用纹理实现这一目标。但是,我在某些显卡(更确切地说是虚拟机图形卡)上遇到了问题。

某些图片超过GL_MAX_TEXTURE_SIZE且卡片不支持不是2的力量的纹理(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来解决图像消失的问题但又导致另一个问题 - glWindowPos2d仅支持openGL 1.4且我的虚拟机仅支持1.1。

我的做法出了什么问题?

我是否应该通过填充纹理处理非功率大小的图像?

我应该将大图像分割成多个纹理(如被子),以使最大纹理尺寸不超过?在这种情况下担心表现。

尝试Mesa3D以确保获得更高的openGL版本,但无法使其为windows编译。是否建议使用其他任何软件渲染器? (等待Swiftshader支持)

1 个答案:

答案 0 :(得分:0)

我设法找到了自己问题的答案。

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

如何在窗口的左边缘或底边缘外绘制glBitmap()或glDrawPixels()基元?

当光栅位置设置在窗口外时,它通常位于视图体积之外,随后标记为无效。对于无效的栅格位置,不会出现glBitmap和glDrawPixels基元的渲染。因为glBitmap / glDrawPixels在光栅位置的上方和右侧产生像素,所以看起来不可能渲染由窗口的左边和/或下边缘裁剪的这种类型的图元。

但是,这是一个经常使用的技巧:将光栅位置设置为视图体积内的有效值。然后拨打以下电话:

  

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

这告诉OpenGL渲染无操作位图,但将当前栅格位置移动(xMove,yMove)。您的应用程序将提供(xMove,yMove)值,将栅格位置放在视图体积之外。使用glBitmap()或glDrawPixels()跟随此调用以进行所需的渲染。