【问题标题】:OpenGL - What to do so that 1 point is equal to 1pixelOpenGL - 如何使 1 点等于 1 像素
【发布时间】:2016-12-27 05:28:03
【问题描述】:

我正在尝试制作一个 gdi+ 到 opengl 的翻译器(因为 gdi+ 是 v.slow),但我不知道该怎么做才能使绘制的图元与实际屏幕坐标匹配(就像在 gdi+ 中一样)。如果没有这个功能,它将毫无用处,因为移植将非常困难。我目前在 vb.net 中使用 openTK。 例如-

GL.Begin(PrimitiveType.Lines)
    GL.Vertex2(0, 0)
    GL.Vertex2(100, 0)
GL.End()

渲染一条远超过 100 像素的线。透视设置为:

    Dim perspective As Matrix4 = Matrix4.CreatePerspectiveFieldOfView(1, Width / Height, 1, 10000)
    Dim lookat As Matrix4 = Matrix4.LookAt(0, 0, 225, 0, 0, 0, 0, 1, 0)

眼睛的 Z 设置为 255,因为它可以提供精确的像素测量值,但仅限于屏幕中心。随着我们进一步前进,它根本不准确。我认为我需要使表面成为球形,以便其上的每个点都处于相同的距离,但不知道该怎么做。

以下是示例图片。线条下方的矩形是 100px(gdi+),线条是使用上面的代码 (gl) 制作的。 Please open this link to view the image

【问题讨论】:

  • 在渲染 2d 事物时不应该使用正交投影吗?否则长度将取决于 z 值和张角。

标签: vb.net opengl 3d gdi+ opentk


【解决方案1】:

BDL 是对的,首先,我们需要得到投影矩阵。如果您使用的是旧的 openGL(您不应该这样做!),您可以调用:

glOrtho(0, window_width, 0, window_height, -1, 1);

其中 window_width 和 window_height 以像素表示。 要将其存储在矩阵中,您可以这样做:

glGetFloatv(GL_PROJECTION_MATRIX, projection_matrix);

那么当你绘制你的顶点时,坐标可以表示为:

glVertex2i(pX,  pY);
glVertex2i(pX + 100,  pY);

这将从 (pX,pY) 开始绘制一条 100 像素的线。 (请注意这里没有使用 vbo 等,我用这些调用来轻松说明)

如果您使用的是现代 openGL,只需计算该投影矩阵并将其传递给您的着色器。要手动计算投影矩阵,您可以按照以下指南操作:

http://www.songho.ca/opengl/gl_projectionmatrix.html

【讨论】:

  • 谢谢,我使用正交投影的方式略有不同,如上一篇文章中的stackoverflow.com/questions/15477367/… 所述。
  • 但是,如果我想实现 3D,比如凸起的矩形或带有真实阴影的块,该怎么办?就像在安卓中一样。奥托是不可能的。有什么想法吗?
  • 这(正交投影)正是您用来创建您所描述的“在 Android 上”的游戏。您将使用此投影,使用普通相机模型视图矩阵,然后像在任何普通 3D 游戏中一样提供 3D 世界坐标中的顶点。当您指定投影矩阵时,您所改变的只是这些 3D 顶点“投影”到视口上的方式。
  • 谢谢。无论如何,我认为如果您在渲染过程中加载透视矩阵以渲染 3D,则它可以工作。然后再次切换到 2d 正交。请注意,我不是在谈论游戏开发。这主要是为了创建快速的 ui。你知道 - 动画和其他东西。
猜你喜欢
  • 2017-09-30
  • 2013-08-17
  • 1970-01-01
  • 2011-05-30
  • 2019-12-23
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多