use*_*267 4 opengl graphics drawing image-processing pixels
我想将像素直接写入屏幕(不使用顶点和多边形)。我调查了类似问题的各种答案,最引人注目的是这里和这里。
我看到有几种方法可以将像素绘制到屏幕上,但它们似乎都是间接的,并且使用了不必要的浮点运算:
GL_POINT
为屏幕上的每个像素绘制一个。我试过这个并且它有效,但这似乎是一种在屏幕上绘制像素的低效方法。当我的数据将被转换为像素数据数组时,为什么要以浮点形式写入我的数据。
创建一个跨越整个屏幕的二维四边形并向其写入纹理。与第一个选项一样,这似乎是将像素放在屏幕上的一种迂回方式。纹理在放到屏幕上之前仍然需要经过光栅化。纹理也必须是方形的,而且大多数屏幕都不是方形的,所以我必须处理这个问题。
如何使用 OpenGL 以最直接、最有效的方式将颜色矩阵(其中pixels[0][0]
对应于左上角和pixels[1920][1080]
对应于右下角)显示在屏幕上?
直接写入帧缓冲区似乎是最有前途的选择,但我只看到人们使用帧缓冲区进行着色。
首先:OpenGL 是一个绘图 API,旨在利用光栅化系统,该系统摄取齐次坐标来定义几何图元,这些图元经过转换和光栅化。仅仅绘制像素并不是 OpenGL API 所关心的。此外,大多数 GPU 本质上是浮点处理器,实际上可以比整数更有效地处理浮点数据。
当我的数据将被转换为像素数据数组时,为什么要以浮点形式写入我的数据。
因为 OpenGL 是一个光栅化 API,即它需要原始几何数据并将其转换为像素。它不将像素作为输入数据处理,除非以图像对象(纹理)的形式处理。
纹理也必须是方形的,而且大多数屏幕都不是方形的,所以我必须处理这个问题。
谁告诉你的,或者你从哪里得到的:他们错了。OpenGL-1.x 有这样的限制,即纹理在任一方向上的大小必须是 2 的幂,但宽度和高度可能不同。自从 OpenGL-2 纹理大小是完全任意的。
然而,纹理也可能不是直接更新屏幕上单个像素的最有效方式。然而,首先绘制像素缓冲区的像素是一个好主意,用于显示的像素被加载到纹理中,然后被绘制到完整的视口四边形上。
但是,如果您的目标是直接操作屏幕像素,中间没有光栅化器,那么 OpenGL 就不是适合这项工作的 API。还有其他 2D 图形 API 允许您直接将像素推送到屏幕。
然而,推动单个像素的效率非常低。我强烈建议对像素缓冲区进行操作,然后将其作为一个整体进行 blited 或绘制以进行显示。使用 OpenGL 绘制一个完整的视口、纹理四边形对此同样有用,并且与任何其他图形 API 一样高效。