OpenGL栅格转换不会产生预期的结果

时间:2014-04-10 23:10:03

标签: c++ opengl graphics raster

网上似乎没有很多关于如何正确使用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(...)的正确用法是什么?

为什么我当前使用的是灰色框,而不是复制或绘制图像中的像素?

enter image description here

1 个答案:

答案 0 :(得分:3)

经过长时间的聊天,暴露了一些问题:

    {li>

    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字节对齐 数据。

  1. 您的数组声明不正确,您正在分配一个指针数组。

    • 指向GLubyte的指针远远大于GLubyte本身(4-8倍,具体取决于编译器/ CPU)。

    • 声明像素数组的正确方法是GLubyte data [115 * 35 * 3],以存储115 * 35像素,每个3字节。

  2. 栅格位置位于对象空间坐标中,但glReadPixels (...)中的位置位于窗口空间坐标中。

    • 如果没有合适的投影矩阵,视口等,坐标系(对象和窗口)之间的比例将不匹配,并且您无法准确地说您的三角形是115 像素 高,35 像素 宽(这是它的对象空间维度)。