如何用3d渲染来缩放2d世界?

时间:2012-02-15 17:25:39

标签: c++ opengl

我正在使用3D模式渲染我的2D游戏,因为相机旋转和放大/缩小比使用2D模式更容易。

现在我遇到了一个我似乎无法解决的问题:

  • 如何使我的世界的2d平面适合屏幕,使1个纹理像素与屏幕上的1个像素匹配?换句话说:我如何计算相机的z位置来实现这一目标?

我的texcoords从0开始并结束为1,因此我可以在GL_NEAREST纹理过滤器模式中看到来自一个图块的所有像素。

我的窗口可调整大小,使得我的图块始终为正方形,但可见区域会根据我调整窗口大小的方式而扩展。

编辑:我的视图端口使用透视模式,而不是等轴测图。但如果在透视模式下不可能,我愿意改为等长。

1 个答案:

答案 0 :(得分:2)

使用将眼睛空间单位映射到像素的正交投影:

glViewport(0,0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);

由于问题更新而更新:

纹素像素→视口像素匹配可以使用透视投影,但仅限于某个约束:纹理四边形必须与透视平截头体近/远平面共面。

怎么做?对于Z =近的glFrustum(left, right, bottom, top, near, far),XY眼睛空间范围[左,右]×[底部,顶部]映射到NDC xy [-1,1]²和NDC xy [-1,1]²映射到视口范围。所以这些都是遵循法律的仿射变换

y(x) = to_lower_bound + (x - from_lower_bound) * (to_upper_bound - to_lower_bound) / (from_upper_bound - from_lower_bound)

所有你需要做的就是将视口映射到NDC到近平面,如果你是Z = / =近接近/ Z的比例。