OpenGL使用glDrawPixels进行旋转

4

我的团队目前只能在opengl 1.4平台上绘制图像,这意味着我们无法使用任何花哨的纹理映射来绘制图像(是的,我们被限制在使用英特尔集成显卡平台,非常令人恼火)。到目前为止,我们已经可以绘制、缩放和翻转图像,但是负责图形的那个人声称,在使用glDrawPixels时无法通过glRotate进行旋转,我们必须使用纹理等其他方式,而这些方法在英特尔平台上无法使用。

我跟他打赌请他吃午饭,说有一种旋转函数,比如glRotate,可以用于直接的位图。这样的函数存在吗?glRotate会起作用吗?虽然我对这个图形的东西有点生疏,但似乎图书馆不允许除了纹理旋转以外的位图旋转,这似乎有些荒谬。

谢谢。

1个回答

7

您不能使用glRotate与glDrawPixels一起使用。

在像素上使用glDrawPixels是最差且性能最低的方式,您甚至可以通过使用糟糕的软件光栅化器将像素放到屏幕上来获得更好的性能。

简而言之,glDRawPixels将像素数据从进程内存复制到图形内存,并执行一些非常简单的转换,如翻转和缩放。任何更高级的操作(如旋转)都需要您实际使用图形芯片组的功能。例如,您必须使用纹理。

纹理确实有效。它们也与GL 1.4和英特尔图形芯片组配合良好。我自己曾经在这样的芯片组上工作过很长时间。您不会获得现代ATI或NVIDIA芯片组的性能,但它们也不是那么糟糕。

我认为有人尝试创建非二次幂大小的纹理,无法做到,然后决定芯片组上的纹理总体而言并不可行。

这不是真的。它们确实有效。您只需知道OpenGL要求您创建二次幂维度的纹理,并且您必须使用更大纹理的子矩形或将多个图像放入一个非常大的纹理中(后者称为纹理集)。

您可以通过调整纹理坐标来补偿更小的图像在较大纹理内的位置。


是的,我愿意。希望他选择一个美味的地方。 - mmr
试一下吧:首先将像素数据加载到纹理中,然后旋转它将非常缓慢,但不会比首次调用glDrawPixels更慢。 - Nils Pipenbrinck
@nils:假设有人想要获取屏幕上的所有像素,进行一些修改,然后再将它们放回屏幕上。他们应该做的是进行更改,将其转换为纹理,创建一个用于放置纹理的对象,然后只需显示它即可。 - Will Mc
@Will,没错。OpenGL被设计为一种仅用于输出的API。从屏幕读取像素是可行的,但代价非常高昂。 - Nils Pipenbrinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接