如何使用OpenGL直接在屏幕上绘制像素数组?

时间:2013-08-21 15:47:46

标签: opengl image-processing graphics drawing pixels

我想直接将像素写入屏幕(不使用顶点和多边形)。我调查了类似问题的各种答案,其中最值得注意的是herehere

我看到有几种方法可以在屏幕上绘制像素,但它们似乎都是间接的并且使用不必要的浮点运算:

  1. 为屏幕上的每个像素绘制GL_POINT。我试过这个并且它可以工作,但这似乎是一种在屏幕上绘制像素的低效方法。为什么在将数据转换为像素数据数组时将数据写入浮点数。

  2. 创建一个横跨整个屏幕的二维四边形并为其编写纹理。像第一个选项一样,这似乎是一种将像素放在屏幕上的迂回方式。在放到屏幕上之前,纹理仍然需要经过光栅化。纹理也必须是正方形,大多数屏幕都不是正方形,所以我必须处理这个问题。

  3. 如何使用OpenGL以最直接,最有效的方式获得一个颜色矩阵,其中pixels[0][0]对应左上角而pixels[1920][1080]对应于右下角?

    直接写入帧缓冲区似乎是最有前途的选择,但我只看到人们使用帧缓冲进行着色。

1 个答案:

答案 0 :(得分:3)

首先:OpenGL是一个绘图API,旨在利用光栅化器系统,该系统可以摄取同质坐标以定义几何图元,这些图元可以被转换,并且可以很好地光栅化。仅仅绘制像素并不是OpenGL API所关注的。此外,大多数GPU本质上都是浮点处理器,实际上可以比整数更有效地处理浮点数据。

  

为什么在将数据转换为像素数据数组时将数据写入浮点数。

因为OpenGL是一个光栅化器API,即它采用原始几何数据并将其转换为像素。它不会将像素作为输入数据处理,除了以图像对象(纹理)的形式。

  

纹理也必须是正方形,大多数屏幕都不是正方形,所以我必须处理这个问题。

无论是谁告诉过你,或者你从那里得到的:他们错了。 OpenGL-1.x具有这样的约束,即纹理必须在任一方向上都是2的幂,但宽度和高度可能不同。自从OpenGL-2纹理大小完全是任意的。

然而,纹理可能不是直接更新屏幕上单个像素的最有效方式。然而,首先绘制像素缓冲区的像素是一个好主意,该像素缓冲区用于显示加载到纹理中,然后被绘制到完整的视口四边形。

但是,如果你的目标是直接操作屏幕上的像素,而中间没有光栅化器,那么OpenGL就不适合这项工作。还有其他2D图形API,可让您直接将像素推送到屏幕上。

然而,推动单个像素是非常低效的。我强烈建议在像素缓冲区上进行操作,然后将其作为整体进行blit或绘制以进行显示。使用OpenGL进行绘制,绘制完整的视口,纹理四边形就像这样,并且与任何其他图形API一样高效。