c++ - OpenGL reshape 函数

标签 c++ opengl 2d

我正在使用鼠标功能和从屏幕上收集的坐标在屏幕上绘制正方形。坐标在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/

相关文章:

c++ - 如何修复 "no matching function for call to ' atoi'"错误?

c++ - opengl橡皮筋框不显示

javascript - 2D Processingjs 游戏中的碰撞

opengl - 在 GLFW3 中请求特定的 OpenGL 上下文版本

macos - 替换核心配置文件中的 GL_LUMINANCE_ALPHA?

unity3d - Inspector 中左上角的复选框在 Unity 中有什么作用?

java - 为什么二维数组的元素会重复?

c++ - 程序适用于 PC 上的 GCC 7.5,但不适用于在线编译器

c++ - 修改结构的变量数据

c++ - cmake target_link_libraries()启动错误无法为目标指定链接库 "debug"