用于OpenGL的重塑函数

Reshape Function For OpenGL

本文关键字:函数 OpenGL 用于      更新时间:2023-10-16

我正在使用鼠标功能向屏幕绘制正方形,以及我从屏幕收集的坐标。坐标在OpenGL程序正在运行的窗口的像素范围内。因此,为了避免在x轴和y轴上将像素转换为-1到1的opengl坐标系,我使用:

g_width

glOrtho (0, 0, g_height, 0, 2200年),

,

0, g_width

为绘图坐标的左右值,

0, g_height

为绘图坐标的底部和顶部值;我相信

0, 2200

是要绘制到的坐标的最小值和最大值。

这是我的重塑函数:

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;
}

我从函数中取当前的宽度和高度,我测试了这与我留下的打印语句一起工作,它在我收缩或拉伸窗口时起作用,但效果似乎没有改变我可以绘制正方形的区域。在这个代码实例中,当我向任何方向拉伸屏幕时,我不能再在屏幕上绘制正方形,但是如果我将其保持在我定义的原始700*700,它将像我定义的那样工作。但是,重塑方法不适用于新的宽度和高度。

任何想法?

glOrtho当前选择的矩阵堆栈的当前顶部矩阵乘以具有给定参数的正交矩阵。但是你不想要那个乘积,你只想要这个正交矩阵,所以你之前应该叫它glLoadIdentity()。但是,由于正射影矩阵应该是投影矩阵,所以之前应该将矩阵模式切换到GL_PROJECTION,之后再切换回GL_MODELVIEW

但是您应该意识到所有这些都是完全不赞成的。现代GL没有矩阵堆栈和glOrtho。你应该使用你自己的矩阵函数(或使用一些库,如glm),并使用顶点着色器应用任何变换,你喜欢你的顶点数据