我正在使用鼠标功能和从屏幕上收集的坐标在屏幕上绘制正方形。坐标在OpenGL程序运行的窗口的像素范围内。因此,为了避免将像素转换为 x 轴和 y 轴的 -1 到 1 的 opengl 坐标系,我使用了:
glOrtho(0,g_width,0,g_height,0,2200);
在哪里
0,g_width
分别是绘图坐标的左右值,
0,g_height
是绘图坐标的bottom和top值, 我相信
0,2200
是要绘制到的坐标的最小值和最大值。
这是我的 reshape 函数:
void resize(GLsizei w, GLsizei h){
cout << "Resize..." << endl
<< "W: " << w << endl
<< "H: " << h << endl;
g_width = w;
g_height = h;
glViewport(0,0,g_width,g_height);
glOrtho(0,g_width,0,g_height,0,2200);
cout << "Ortho called" << endl;
}
我从函数中获取当前的宽度和高度,我测试了它与我留下的打印语句一起工作,并且它在我缩小或拉伸(stretch)窗口时工作,但效果似乎没有改变我可以改变的区域绘制正方形。在这个代码实例中,当我向任何方向拉伸(stretch)屏幕时,我不能再在屏幕上绘制正方形,但如果我将它保留在我定义的原始 700*700 上,它将按我定义的那样工作。但是 reshape 方法不适用于新的宽度和高度。
有什么想法吗?
最佳答案
glOrtho
将将当前所选矩阵堆栈的当前顶部矩阵乘以具有给定参数的邻位矩阵。但是你不需要那个乘积,你只需要这个正交矩阵,所以你应该先调用 glLoadIdentity()
。但是,由于正交矩阵应该是投影矩阵,因此您应该先将矩阵模式切换为 GL_PROJECTION
,然后再切换回 GL_MODELVIEW
。
但是您应该知道,所有这些都完全弃用。现代 GL 没有矩阵堆栈和 glOrtho
。您应该使用自己的矩阵函数(或使用像 glm 这样的库),并使用顶点着色器将您喜欢的任何变换应用于顶点数据。
关于c++ - OpenGL reshape 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060940/