glDrawPixels() 与 0.375 翻译
Posted
技术标签:
【中文标题】glDrawPixels() 与 0.375 翻译【英文标题】:glDrawPixels() with 0.375 translation 【发布时间】:2014-02-26 02:38:34 【问题描述】:我注意到在使用 0.375 转换时 glDrawPixels() 有一些奇怪的行为。这是我的 GL 初始化:
width = 640; height = 480;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity( );
glTranslatef(0.375, 0.375, 0.0);
现在我想在我的 GL 窗口的最后 30 行绘制一个 640x30 像素的缓冲区。因此,我执行以下操作:
glRasterPos2i(0, 480);
glDrawPixels(640, 30, GL_RGBA, GL_UNSIGNED_BYTE, pixelbuffer);
不幸的是,使用此代码无法绘制任何内容。 glGetError() 也返回 0。有趣的是,一旦我删除对 glTranslatef(0.375, 0.375, 0.0) 的调用,一切正常!
那么有人可以向我解释一下为什么这两个轴上的 0.375 平移会混淆 glDrawPixels() 吗?这是否在内部以某种方式四舍五入到 1.0,使我对 glDrawPixels() 的调用突然想要绘制超出上下文的边界,因此它被 OpenGL 剪裁了?这是我能想到的唯一解释,但我不明白为什么 OpenGL 应该将 0.375 转换四舍五入为 1.0……它应该向下舍入为 0.0,不是吗?
【问题讨论】:
您为什么认为正在进行舍入?管道是完全浮点的,这里唯一重要的时间是当您将窗口空间位置捕捉到像素位置以进行光栅化时。您的问题发生在之前甚至发生,它与剪辑有关。最终,glWindowPos2i (...)
将是一个更好的解决方案,如我的回答中所述。
很遗憾,我不能使用 glWindowPos2i(),因为那是 OpenGL 1.4,我需要支持更早的版本。
【参考方案1】:
在给定投影矩阵的情况下,点 (0,480) 实际上跨越了一个剪切平面。您的亚像素移位黑客将点推到断点之外,并且光栅位置被剪裁。在 GL 中,glRasterPos (...)
将使所有后续光栅操作无效,只要初始位置被裁剪(在本例中就是裁剪)。
你可以试试glRasterPos2i (0, 479)
。无论如何,考虑到窗口的尺寸,这完全更有意义。您也可以放弃整个字谜并使用glWindowPos2i (...)
,而不是依靠您的投影和模型视图矩阵来定位窗口空间中的光栅坐标。
【讨论】:
谢谢,这个解释很有道理。所以我们最终得到 480.375,然后因为 > 480.0 而被剪裁。不过还有一个问题:为什么说 glRasterPos2i(0, 479) 更有意义?我的窗口高度是 480 像素,所以我必须从 y-rasterpos 480 开始绘制。如果我从 479 开始,窗口底部会有一个空白行。 如果您要在 Y 方向上移动像素坐标 +.375,则光栅 pos 唯一可能有意义的位置是 479。如果您进行了移动 (+.375,-.375 ) 那么这将是有道理的。不过,我不确定您为什么需要这种亚像素移位? 这里的主要问题是您的投影矩阵正在翻转 Y 轴,通常(例如glOrtho (0, width, 0, height, 0, 1)
)这个坐标可以描述为(0,0),然后移位也有意义.
实际上,使用 0.375 而不是 -0.375 似乎首先是这里的问题。我从msdn.microsoft.com/en-us/library/windows/desktop/… 那里得到了这个 0.375 转变的想法,因为我遇到了一些图形基元的“一个像素偏移”问题,这个 0.375 转变显然解决了。但是我没有看到 MSDN 上的示例没有使用翻转轴……但是使用翻转的 Y 轴我当然需要 -0.375。我现在已将其更改为 +.375/-.375,现在可以正常工作了!
不过还是有点奇怪,因为严格来说,我仍在画断点之外,但现在是在 x 轴上。使用 +.375/-.375 翻译,我现在正在从 0.375 绘制到 640.375,所以从理论上讲,它应该被剪裁并且什么都不应该被绘制......但它不会被剪裁...一切都画得很好。奇怪...【参考方案2】:
我无法回答您关于为什么 glTranslatef
会阻止 glDrawPixels
工作的问题,但我可以告诉您,这不是选择绘制位置的方法。查看man page for glDrawPixels
了解更多信息。它会告诉你glRasterPos
和glWindowPos
【讨论】:
您能否详细说明您认为我使用 glDrawPixels() 的方式到底有什么问题?只是将我指向手册并没有真正的帮助,特别是因为我实际上在我的项目中经常使用 glDrawPixels() 并且它总是按预期工作,除了在这种情况下(由于 Andon M. Coleman 现在也解决了) . @Andreas 因为glTransform
定义了一个 3D 变换矩阵。如果要选择特定的像素位置,使用实际执行此操作的函数更有意义,而不是使用归一化的浮点转换因子。我指的是手册中的相关功能。以上是关于glDrawPixels() 与 0.375 翻译的主要内容,如果未能解决你的问题,请参考以下文章
malloc() 和 glDrawPixels() 的访问冲突?
有没有办法使用 glDrawPixels 渲染单通道灰度图像?