openGl 重塑函数

Posted

技术标签:

【中文标题】openGl 重塑函数【英文标题】:openGl Reshape function 【发布时间】:2017-03-21 14:16:04 【问题描述】:

谁能告诉我这段代码中 if-else 语句的意义何在?它到底是做什么的? 尤其是 glOrtho 中高除以宽的部分。

*如果该方法对任何人都模​​棱两可,这句话可能会有所帮助.. “这种重塑通过使视口和世界窗口具有相同的纵横比来保留形状”

void myReshape(int w, int h)

    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-50.0, 50.0, -50.0*(GLfloat)h / (GLfloat)w,
            50.0*(GLfloat)h / (GLfloat)w, -1.0, 1.0);
    else
        glOrtho(-50.0*(GLfloat)w / (GLfloat)h,
            50.0*(GLfloat)w / (GLfloat)h, -50.0, 50.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


提前谢谢!

【问题讨论】:

【参考方案1】:

基本上这个想法是保持投影的长宽比为正方形(这就是 wh 的划分)在 XY 平面中的边长为 100 的正方形(世界空间单位)围绕选定的 XY 原点 (0,0) 适合窗口的 short 大小(这就是 if 的用途,以决定两个大小中的哪一个窗口是短尺寸)。

【讨论】:

【参考方案2】:

纵横比可以通过两种不同的方式指定:

    width/height height/width

如果宽度大于高度,则width/height &gt; 1height/width &lt; 1

同样,如果高度大于宽度,width/height &lt; 1height/width &gt; 1

如果屏幕的尺寸不相等,我们不能将投影的宽度和高度设置为相同的值。否则,一切都会显得捉襟见肘:

因此,我们将其中一个维度乘以纵横比。

如果纵横比大于 1,则应乘以更大的维度。

同样,如果纵横比小于 1,则应乘以较小的维度。

您的示例所做的是确保纵横比始终保持大于 1

因此,它总是必须乘以更大的维度,这可能会有所不同。 这就是 if-else 的用途:

如果w &lt;= h高度是更大的维度),纵横比乘以glOrtho();的顶部/底部参数 否则(h &lt; w宽度是更大的维度),纵横比乘以glOrtho();的left/right参数

实际上,X 和 Y 维度(使用 if-else 情况)不能低于 100 个单位(-50 到 + 50) - 因为纵横比总是大于 1

【讨论】:

真的,我感激不尽。你对我帮助很大。谢谢。 没问题,伙计。祝你进一步发展好运:)

以上是关于openGl 重塑函数的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL如何使用固定管线下的着色器渲染一个正方形,并用特殊键控制移动

OpenGL旋转场景不如预期

哪有opengl所有函数的列表?

第一个OpenGL程序

OpenGL:随机调用 OpenGL 函数时崩溃

Opengl“找不到当前函数的边界”