网上似乎没有很多关于如何正确使用OpenGL提供的栅格转换方法的例子。
我画了一个简单的三角形,我试图仅仅复制三角形并将其重绘在其他地方。我得到了非常不寻常的结果,我不明白:
给定三角形(粉红色):verts [3] = {{10.0,25.0},{125.0,25.0},{60.0,60}};
我展示了三角形:
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.
glColor3f (1.0, 0.5, 0.5); // Set initial fill color (pink).
triangle (verts); // Display colored triangle.
然后,我尝试通过栅格转换重绘三角形:
GLubyte *data [115][35];
glReadPixels(10, 25, 115, 35, GL_RGB, GL_UNSIGNED_BYTE, data);
glRasterPos2i(50,100);
glDrawPixels(35, 115, GL_RGB, GL_UNSIGNED_BYTE, data);
我认为这样做的是复制从(10,25)开始向右移动300像素的所有像素。这不仅仅包含三角形。
我认为通过绘制像素它只会像它们一样绘制它们,而是绘制一个我甚至无法理解的灰色框。
glReadPixels(...);
和glDrawPixels(...)
的正确用法是什么?
为什么我当前使用的是灰色框,而不是复制或绘制图像中的像素?
答案 0 :(得分:3)
GL_RGB
像素不受glReadPixels (...)
和glDrawPixels (...)
使用默认像素存储,GL尝试将其读取的每一行存储在4字节边界上;在OpenGL中,3字节RGB像素使这个以及许多其他东西变得非常混乱。
您必须使用glPixelStorei (GL_PACK_ALIGNMENT, 1)
格式在glReadPixels (...)
之前致电GL_RGB
,否则可能会填充 输出中每行的结尾 使用额外的字节来满足4字节的行对齐。如果不选中,默认对齐将最终导致内存溢出。
同样,您需要在glPixelStorei (GL_UNPACK_ALIGNMENT, 1)
之前使用glDrawPixels (...)
,以便在从 输入读取行时不会尝试跳过字节以保持4字节对齐 数据。
您的数组声明不正确,您正在分配一个指针数组。
指向GLubyte
的指针远远大于GLubyte
本身(4-8倍,具体取决于编译器/ CPU)。
声明像素数组的正确方法是GLubyte data [115 * 35 * 3]
,以存储115 * 35像素,每个3字节。
栅格位置位于对象空间坐标中,但glReadPixels (...)
中的位置位于窗口空间坐标中。