最终目标是能够在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
我已设法通过将glRasterPos2i
替换为glWindowPos2d
来解决图像消失的问题但又导致另一个问题 - glWindowPos2d
仅支持openGL 1.4且我的虚拟机仅支持1.1。
我的做法出了什么问题?
我是否应该通过填充纹理处理非功率大小的图像?
我应该将大图像分割成多个纹理(如被子),以使最大纹理尺寸不超过?在这种情况下担心表现。
尝试Mesa3D以确保获得更高的openGL版本,但无法使其为windows编译。是否建议使用其他任何软件渲染器? (等待Swiftshader支持)
答案 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()跟随此调用以进行所需的渲染。