opengl 如何设置正射投影以适合多个屏幕尺寸

a14dhokn  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(157)

我目前正试图在OpenGL中为一个游戏设置正射投影,但我在正确设置它方面有点挣扎。
目前,我正在使用以下简单函数计算投影:

glm::mat4 projection = glm::ortho(0.0f, width, height, 0.0f, -10000.0f, 10000.0f);

其中宽度和高度由屏幕尺寸给出。
但是这会导致一些问题,即当我改变屏幕大小时,屏幕上的对象会被拉伸或压缩。当屏幕大小变大时,会显示更多的当前场景。
我想要的是,我总是看到相同的东西在屏幕上独立于大小的窗口,但它也不应该扭曲,如果我调整窗口的一些奇怪的高宽比。
我尝试了一些东西,如使用宽高比,但我要么没有看到屏幕上的任何东西或东西甚至更严重的扭曲。
这里也是我的模型和视图矩阵代码,以防我做错了什么:

glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(TransformComponent.position.x+width/2 /*width and height are needed to place the object in the center of the screen*/, TransformComponent.position.y+height/2, TransformComponent.position.z));
model = glm::scale(model, glm::vec3(renderable.GetWidth(), renderable.GetHeight(), 1.0f));
sh.setMat4("model", model);
ViewMatrix

glm::mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3(position,0)) *
glm::rotate(glm::mat4(1.0f), glm::radians(0.0f), glm::vec3(0, 0, 1));

glm::mat4 m_ViewMatrix = glm::inverse(transform);

小屏幕

大屏幕

屏幕变形

另一个扭曲的例子

icomxhvb

icomxhvb1#

如果您使用分辨率来缩放居中的2D对象,则原始偏移量将以1:1的比例将其居中。

srcaspect = 4f / 3f;
dstaspect = width / height;
orthosize = (dstaspect < 16f / 9f ? dstaspect : 16f / 9f) / (16f / 9f);
centerscalex = 0.5f*(height - 0);
centerscaley = 0.5f*(height - 0);
centeroffsetx = (scalex + 0) * srcaspect;
centeroffsety = scaley + 0;

然后使用下面的公式将所有这些都放到矩阵中,然后得到一个居中的相位显示:

glm::mat4 projection = glm::ortho(centeroffsetx - (centerscalex * dstaspect * orthosize),centeroffsetx + (centerscalex * dstaspect * orthosize),centeroffsety - (centerscaley * orthosize),centeroffsety + (centerscaley * orthosize));

如果你不想让对象在更高的分辨率下缩小,我建议你使用默认的高度,比如:

centerscalex = 0.5f*(480f - 0);
centerscaley = 0.5f*(480f - 0);
centeroffsetx = scalex + 0;
centeroffsety = scaley + 0;

相关问题