4

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

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

  1. 为屏幕上的每个像素绘制一个GL_POINT。我已经尝试过了,它可以工作,但这似乎是一种将像素绘制到屏幕上的低效方式。为什么要将我的数据转换为像素数据数组时以浮点形式写入数据。

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

如何使用 OpenGL 以最直接和最有效的方式将对应于pixels[0][0]左上角和右下角的颜色矩阵显示在屏幕上?pixels[1920][1080]

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

4

1 回答 1

5

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

为什么要将我的数据转换为像素数据数组时以浮点形式写入数据。

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

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

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

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

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

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

于 2013-08-21T23:20:52.587 回答