在OpenGL中,我可以绘制一个完全在坐标(5,5)处的像素吗?

通过(5,5)我的意思是第五行和第五列。

我发现使用屏幕坐标绘制东西非常困难,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间。 为什么阻止程序员使用屏幕坐标/窗口坐标是如此严重?

几年前我做了一些3D编程,虽然我不是专家,但我认为你忽略了经典位图DrawPixel(x, y)图形与使用Direct3D和OpenGL完成的图形类型之间的一个非常重要的区别。

回到3D之前的几天,计算机图形学主要是关于位图,也就是说有色点的集合。 这些点与显示器上的像素有1:1的关系。

然而,这具有许多缺点,包括使3D非常困难并且需要不同尺寸的位图以用于不同的显示分辨率。

在OpenGL / D3D中,您正在处理矢量图形。 线条由三维坐标空间中的点定义,形状由线条定义,依此类推。 表面可以具有纹理,可以添加灯光,也可以添加各种类型的照明效果等。然后可以通过虚拟相机查看整个场景或其一部分。

你看到的是什么,虽然这个虚拟相机是场景投影到2D表面上。 我们现在还在处理矢量图形。 但是,由于计算机显示器由离散像素组成,因此必须对该矢量图像进行光栅化,从而将矢量转换为具有实际像素的位图。

总而言之,您不能使用屏幕/窗口坐标,因为OpenGL基于矢量图形。

最简单的方法可能是通过glOrtho将投影设置为与渲染空间的像素尺寸相匹配。 然后顶点可以是像素坐标。 缺点是调整窗口大小可能会导致问题而且你大部分都在浪费加速转换。

假设一个640×480的窗口:

 // You can reverse the 0,480 arguments depending on you Y-axis // direction preference glOrtho(0, 640, 0, 480, -1, 1); 

帧缓冲对象和纹理是另一种途径,但您必须创建自己的光栅化例程(绘制线,圆,位图等)。 有这个问题的liblas。

@dandan78 OpenGL不是Vector Graphics渲染器。 是一个光栅化器。 并且以更精确的方式是通过C语言接口描述的标准。 光栅化器将3D协调空间(汽车,树,球体,龙)中表示的对象映射到2D协调空间(比如平面,应用程序窗口或显示器),这些2d坐标属于离散的协调平面。 光栅化的计数器渲染方法是光线跟踪。

矢量图形是一种通过数学函数以非离散方式表示一组曲线,直线或类似几何图元的方法。 因此,矢量图形位于“模型表示”字段中,而不是“渲染”字段。

您可以通过将模型视图矩阵设置为标识并将投影设置为正交投影来更改“相机”以使3D坐标与屏幕坐标匹配(请参阅我对此问题的回答 )。 然后,您可以在所需的屏幕坐标处绘制单点基元。

您还可以使用glWindowPos设置栅格位置(在屏幕坐标中工作,与glRasterPos不同),然后使用glDrawPixels绘制1×1像素图像。