是什么可以阻止OpenGL glDrawPixels在某些视频卡上工作?
以下代码不将数据写入Intel集成视频卡(例如MacBook)上的后台缓冲区。在ATI卡上(例如在iMac中),它会吸引到后缓冲区。宽度和高度正确(和800x600缓冲区),并且m_PixelBuffer正确填充了0xAA00AA00。
到目前为止,我最好的猜测是需要glWindowPos设置有些不对劲。我目前未设置它(或者栅格位置),当我得到GL_CURRENT_RASTER_POSITION时,我注意到ATI卡上的默认值为0,0,0,0,而Intel为0,0,0,1. 当我将ATI卡上的栅格pos设置为0,0,0,1时,我得到的结果与Intel卡相同,没有任何东西被提取到后台缓冲区中。我缺少一些转换状态吗?这是2D应用程序,因此视图转换非常简单。
glDrawPixels(GetBufferWidth(), GetBufferHeight(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, m_PixelBuffer);
我可以提供的任何其他信息,请询问。我几乎是OpenGL和Mac newb,所以不知道我是否提供了足够的信息。
解决方案
回答
尽管我不确定这次是否是问题,但我一直对Intel的OpenGL实现有疑问。我认为我们遇到了一些字节顺序问题。请阅读并随意尝试使用用于包装和颜色顺序的不同常量。
http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_25.html
我知道这是OSX指南,我们可能会在其他站点上的其他平台上找到类似的OpenGL文章。这应该适用。
回答
I've always had problems with OpenGL implementations from Intel
这就是我担心的问题,但是我很难相信他们会搞砸像glDrawPixels这样基本的东西,而且,因为我可以通过更改栅格位置矢量来"复制"问题,所以这让我感到困惑认为这是我的错,我缺少一些基本知识。
I think you're running into some byte-order issues
那是我的初衷,我尝试了不同的包装方式,但没有结果。我还尝试使用一些值打包缓冲区,如果出现混乱,这些值将显示可用的alpha值,但没有结果。这就是为什么我要刺耳栅格pos树的原因,但是老实说我还是不是100%确信。请注意,如果有所不同,我仅针对Intel Mac。
感谢我们提供的链接,这是一本不错的书,也非常适合将来参考。我会修改,但直到获得3分以上才可以:)
回答
像glDrawPixels这样的基本功能不太可能无法正常工作。我们是否尝试过一些非常简单的设置,例如GL_RGB或者GL_RGBA用于格式,GL_UNSIGNED_BYTE或者GL_FLOAT用于类型?如果没有,我们能否与我们分享能够重现我们问题的最小程序?
回答
默认栅格位置应为(0,0,0,1),但我们可以将其重置以确保。
在调用glDrawPixels()之前,尝试
GLint valid; glGet(GL_CURRENT_RASTER_POSITION_VALID, &valid);
这应该告诉我们当前栅格位置是否有效。如果是这样,那么这不是问题。