载栅格变革没有产生预期的结果
题
那似乎不是很多的例子网络如何正确使用栅格变换的方法提供照片.
我已经绘制一个简单的三角形,我想仅仅是复制的三角和重新绘制的其他地方。我得到非常不寻常的结果,我不理解:
鉴于三角(粉红):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(...)
?
为什么是我目前的使用给予一个灰色框并在任何方式拷贝或图像素的图像?
解决方案
经过长时间聊天,一些问题暴露:
GL_RGB
像素都不喜欢的glReadPixels (...)
和glDrawPixels (...)
使用的默认素商店,GL试图储存每个行它会读取关于一个4-byte边界;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 (...)
是的在窗口-空间的坐标。- 没有一个适当的投矩阵,视,等等。规模之间的协调系统(对象和窗口)不会比赛,你不能准确地说你的三角形115 像素 高层和35 像素 广(这些都是它的对象的空间尺寸)。