对 OpenGL 绘图形状使用值而不是 -1...1?

Posted

技术标签:

【中文标题】对 OpenGL 绘图形状使用值而不是 -1...1?【英文标题】:Use values instead of -1...1 for OpenGL drawing shapes? 【发布时间】:2015-12-03 01:34:41 【问题描述】:

如果我想在 OpenGL 中绘制平面,我会执行以下操作:

glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5, -0.5, 0.5);
glEnd();

这会绘制一个覆盖画布 50% 的白色平面(两个轴上从 -0.5 到 0.5)。但是,我想改用数字。我不想使用 -1 到 1,而是使用 0 到 n 之类的东西,其中 n 是我的画布的尺寸。对于上面的示例,在 1000 像素画布上的两个轴上的值是 250 到 750,而不是 -0.5 到 0.5。

【问题讨论】:

【参考方案1】:

这就是转换矩阵的用途。在您的情况下,您可以根据需要设置一个具有限制的正交投影矩阵。在你的例子中

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1000, 0, 1000, -1, 1);

将设置一个查看体积,以便边界在左下角的 0,0 和右上角的 1000,1000。

请注意,这(以及您提供的代码)使用旧的、已弃用的固定功能管道。您应该放弃它以支持基于着色器的方法。

【讨论】:

+1 用于解释它,-1 用于将着色器推荐作为答案的一部分(而不是评论)。 干杯。我想glOrtho 也可以将(-500,500,-500,500,...) 作为参数? glOrtho 将浮点值作为参数。你可以传递任何适合浮动的东西。 OpenGL 不会“认为”它是像素。一切都以任意单位发生,只有在最后一步将数字转换为像素空间。 @immibis:不,着色器推荐必须去那里。 OP 使用的功能已经非常过时,不应在任何新编写的代码中使用。当使用着色器时,有很多不同的方法可以获得相同的结果。 @datenwolf 你知道吗,一款非常成功的、2B 美元的游戏是仅使用 OpenGL 1.1 功能和多纹理制作的?固定功能管道不起作用的实际原因是什么?

以上是关于对 OpenGL 绘图形状使用值而不是 -1...1?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有移动对象的 OpenGL 实例化绘图

GLUT OpenGL - 仅使用 GL_POINTS 绘制形状

OpenGL用鼠标拖动绘制矩形?

qt opengl的图形怎么刷新

(转)使用OpenGL显示图像定义Shapes

C语言中的OpenGL添加另一个对象