0

最终目标是能够在 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

我已经设法通过替换解决了图像消失的问题glRasterPos2iglWindowPos2d但这又导致了另一个问题 -glWindowPos2d仅受 openGL 1.4 支持,而我的虚拟机仅支持 1.1。

我的方法有什么问题?

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

我是否应该将大图像分割成许多纹理(如被子)以使最大纹理大小不超过?在这种情况下担心性能。

尝试了 Mesa3D 以确保获得更高的 openGL 版本,但无法使其为 windows 编译。有其他推荐的软件渲染器吗?(等待 Swiftshader 支持)

4

1 回答 1

0

我已经设法找出我自己问题的答案。

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

如何绘制在窗口左边缘或下边缘之外具有初始 glRasterPos() 的 glBitmap() 或 glDrawPixels() 图元?

当光栅位置设置在窗口之外时,它通常在视图体积之外,随后被标记为无效。渲染 glBitmap 和 glDrawPixels 基元不会出现无效的光栅位置。因为 glBitmap/glDrawPixels 会在光栅位置的上方和右侧产生像素,所以似乎无法渲染这种类型的被窗口左侧和/或底部边缘裁剪的图元。

但是,这里有一个常用的技巧:将光栅位置设置为视图体积内的有效值。然后进行以下调用:

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

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

于 2013-09-12T04:50:54.643 回答