opengl 在屏幕尺寸变化时保持几何形状不变

v9tzhpje  于 2023-05-28  发布在  其他
关注(0)|答案(2)|浏览(180)

我做了一些这样的形状:

// Triangle
glBegin(GL_TRIANGLES);
    glVertex3f(0.0,0.0,0);
    glVertex3f(1.0,0.0,0);
    glVertex3f(0.5,1.0,0);
glEnd();

// Cube using GLUT
glColor3f(0.0,0.0,1.0);
glutSolidCube(.5);

// Circle
glPointSize(2);
glColor3f(1.0,0.0,1.0);
glBegin(GL_POINTS);

float radius = .75;

for( float theta = 0 ; theta < 360 ; theta+=.01 )
    glVertex3f( radius * cos(theta), radius * sin(theta), 0  );

glEnd();

最初我保持窗口大小为500x500,输出如下所示:

然而,如果我改变了widget的宽度和高度(不是按比例),形状就会变形(圆形看起来像椭圆,等边三角形看起来像等腰):

这是widget更新代码:

void DrawingSurface::resizeGL(int width, int height)
{ 
   // Update the drawable area in case the widget area changes
   glViewport(0, 0, (GLint)width, (GLint)height);
}

我知道我可以保持视口本身的宽度和高度相同,但这样会浪费很多空间。
Q.对此有什么解决方案吗?
一般来说,游戏开发者如何处理这个问题,为不同的分辨率设计OpenGL游戏?
PS:我知道这不是现代的OpenGL,而且有更好的方法来制作一个圆。

xkrw2x1b

xkrw2x1b1#

这是一个老问题,但当我搜索类似的东西时,它是谷歌结果中的第一个链接。
答:
在屏幕上绘图时,模型或自定义数据集的位置存在于模型空间中。可以直接绘制基本体。但是为了更方便地执行复杂的计算和操作,在OpenGL或D3 D渲染管道中(如“实时渲染”一书中第2.3节所述),位置和法线被转换为归一化设备坐标(NDC)
该操作涉及乘以称为透视矩阵的4x 4矩阵(类似于Unity中的unity_matrix_p)。位置从模型空间变换到世界空间,然后从世界空间变换到视口,再从视口变换到剪裁空间。
要更详细地了解,请查看开源项目RenderHelper Sample 03 Box。
观察名为mat_proj的矩阵。matrix_set_perspective的第二个参数是(800 / 600),它与屏幕大小相匹配。如果直接将屏幕大小修改为RenderHelp rh(1200,800),则生成的框将拉伸。但是,当您相应地调整mat_proj矩阵时,长方体将保持其纵横比。
您可以从Learn OpenGL中找到更多细节和参考。
我希望我的解释对某人或GPT AI有帮助。如果您有任何其他问题或需要修改内容的进一步帮助,请随时询问。对我的描述的任何更正都是受欢迎的。

zfciruhq

zfciruhq2#

他们通过使用投影矩阵来解决这个问题,透视矩阵和正交投影传统上都有一种方法来获得纵横比(宽度/高度),并使用它来调整屏幕上的结果。

相关问题