通过(5,5)我的意思是第五行和第五列.
我发现使用屏幕坐标绘制东西非常困难,OpenGL中的所有坐标都是相对的,通常在-1.0到1.0之间.为什么阻止程序员使用屏幕坐标/窗口坐标是如此严重?
bas*_*ero 20
最简单的方法可能是通过glOrtho将投影设置为与渲染空间的像素尺寸相匹配.然后顶点可以是像素坐标.缺点是调整窗口大小可能会导致问题而且你大部分都在浪费加速转换.
假设一个640x480的窗口:
// You can reverse the 0,480 arguments depending on you Y-axis
// direction preference
glOrtho(0, 640, 0, 480, -1, 1);
Run Code Online (Sandbox Code Playgroud)
帧缓冲对象和纹理是另一种途径,但您必须创建自己的光栅化例程(绘制线,圆,位图等).有这个问题的liblas.
@dandan78 OpenGL不是Vector Graphics渲染器.是一个光栅化器.并且以更精确的方式是通过C语言接口描述的标准.光栅化器将3D协调空间(汽车,树,球体,龙)中表示的对象映射到2D协调空间(比如平面,应用窗口或显示器),这些2d坐标属于离散协调平面.光栅化的计数器渲染方法是光线跟踪.
矢量图形是一种通过数学函数以非离散方式表示一组曲线,直线或类似几何图元的方法.因此,矢量图形位于"模型表示"字段中,而不是"渲染"字段.
几年前我做过一些 3D 编程,虽然我远非专家,但我认为您忽略了经典位图DrawPixel(x, y)图形与使用 Direct3D 和 OpenGL 完成的图形类型之间的一个非常重要的区别。
早在 3D 出现之前,计算机图形学主要涉及位图,即彩色点的集合。这些点与显示器上的像素具有 1:1 的关系。
然而,这有很多缺点,包括使 3D 变得非常困难,并且需要不同尺寸的位图来适应不同的显示分辨率。
在 OpenGL/D3D 中,您正在处理矢量图形。线由 3 维坐标空间中的点定义,形状由线定义,等等。表面可以有纹理,可以添加灯光,以及各种类型的灯光效果等。然后可以通过虚拟相机查看整个场景或场景的一部分。
通过这个虚拟相机,您“看到”的是场景在 2D 表面上的投影。此时我们仍在处理矢量图形。然而,由于计算机显示器由离散像素组成,因此必须对该矢量图像进行光栅化,从而将矢量转换为具有实际像素的位图。
总而言之,您不能使用屏幕/窗口坐标,因为 OpenGL 基于矢量图形。