请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 937|回复: 4

有关OpenGL的视口大小获取 [复制链接]

Rank: 8Rank: 8

注册时间
2017-7-31
积分
175
发表于 2017-8-1 09:51:46 |显示全部楼层
最近刚开始研究OpenGL的使用方法,但是有个很有意思的事情,我创建了一个窗口大小为1920×1080,视口直接设置为glViewport(0,0,1920,1080).
但是在使用GetIntergerv读取回窗口大小时,发现读回的窗口大小始终是1394×796(我的电脑分辨率为1366×768),我对这一点甚为不解,求高人指点。
窗口的Reshape函数我也试过停用与启用,结果没有变化

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2007-6-11
积分
30012
发表于 2017-8-1 10:01:06 |显示全部楼层
你用的什么框架,我猜是Glut?贴一下代码吧。

使用道具 举报

Rank: 8Rank: 8

注册时间
2017-7-31
积分
175
发表于 2017-8-1 11:58:30 |显示全部楼层
Jedimaster 发表于 2017-8-1 10:01
你用的什么框架,我猜是Glut?贴一下代码吧。

的确用的是GLUT

代码如下,我用的Qt的开发环境
  1. #include <QCoreApplication>
  2. #include "glut.h"
  3. #include <QDebug>

  4. void init(void)
  5. {
  6.     glClearColor(1.0,1.0,1.0,0.0);//指定显示窗口背景颜色

  7.     glMatrixMode(GL_PROJECTION);//指定观察模式
  8.     gluOrtho2D(0.0,200.0,0.0,200.0);//指定观察范围
  9. }

  10. void lineSegment (void)
  11. {
  12.     glClear(GL_COLOR_BUFFER_BIT);//激活背景色显示

  13.     glColor3f(0.0,0.4,0.0);//设定直线颜色
  14.     glBegin(GL_LINES);
  15.             glVertex2i(180,15);
  16.             glVertex2i(10,145);
  17.     glEnd();

  18.     int point1 []={50,100};
  19.     int point2 []={75,150};
  20.     int point3 []={100,200};

  21.     glPointSize(50);
  22.     glBegin(GL_POINTS);
  23.             glVertex2iv(point1);
  24.             glVertex2iv(point2);
  25.             glVertex2iv(point3);
  26.     glEnd();

  27.     glFlush();
  28. }

  29. int main(int argc, char *argv[])
  30. {
  31.     QCoreApplication a(argc, argv);

  32.     glutInit(&argc,argv);
  33.     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
  34.     glutInitWindowPosition(0,0);
  35.     glutInitWindowSize(1920,1080);

  36.     glutCreateWindow("An Example of OpenGL Program");

  37.     init();
  38.     glutDisplayFunc(lineSegment);

  39.     /*********尝试使用显示表*********/
  40.     const double TWO_PI =6.2831853;
  41.     GLuint regHex;

  42.     GLdouble theta;
  43.     GLint x,y,k;
  44.     //
  45.     regHex=glGenLists(1);
  46.     glNewList(regHex,GL_COMPILE);
  47.         glBegin(GL_POLYGON);
  48.         for (k=0;k<6;k++)
  49.         {
  50.             theta=TWO_PI*k/6.0;
  51.             x=200+150*cos(theta);
  52.             y=200+150*sin(theta);
  53.             glVertex2i(x,y);
  54.         }
  55.         glEnd();
  56.     glEndList();

  57.     glCallList(regHex);
  58.     /*********尝试使用显示表*********/

  59.     GLint viewPort[4]={0};
  60.     glGetIntegerv(GL_VIEWPORT,viewPort);
  61.     qDebug()<<QString("%1 %2 %3 %4").arg(viewPort[0]).arg(viewPort[1]).arg(viewPort[2]).arg(viewPort[3]);

  62.     glutMainLoop();

  63.     return a.exec();
  64. }
复制代码

使用道具 举报

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2007-6-11
积分
30012
发表于 2017-8-1 14:55:32 |显示全部楼层
lineSegment最后应该是glutSwapBuffers,不需要用glFlush。

你尝试获取窗口在渲染正式开始之前,那个是不对的。因为其实没有正式初始化。你可以在glutReshapeWindow,和lineSegment内尝试获取。

使用道具 举报

Rank: 8Rank: 8

注册时间
2017-7-31
积分
175
发表于 2017-8-1 16:24:00 |显示全部楼层
本帖最后由 bycy0801 于 2017-8-1 16:25 编辑
Jedimaster 发表于 2017-8-1 14:55
lineSegment最后应该是glutSwapBuffers,不需要用glFlush。

你尝试获取窗口在渲染正式开始之前,那个是不 ...

尝试了将glFlush()换成了glSwapBuffers(),并且尝试了在窗口大小改变的回调函数中强制设定窗口大小,并在回调函数中读取当前窗口大小,这次算是对了,十分感谢。

代码:
  1. #include <QCoreApplication>
  2. #include "glut.h"
  3. #include <QDebug>

  4. void init(void)
  5. {
  6.     glClearColor(1.0,1.0,1.0,0.0);//指定显示窗口背景颜色

  7.     glMatrixMode(GL_PROJECTION);//指定观察模式
  8.     gluOrtho2D(0.0,200.0,0.0,200.0);//指定观察范围
  9. }

  10. void lineSegment (void)
  11. {
  12.     glClear(GL_COLOR_BUFFER_BIT);//激活背景色显示

  13.     glViewport(0,0,1920,1080);

  14.     glColor3f(0.0,0.4,0.0);//设定直线颜色
  15.     glBegin(GL_LINES);
  16.     glVertex2i(180,15);
  17.     glVertex2i(10,145);
  18.     glEnd();

  19.     int point1 []={50,100};
  20.     int point2 []={75,150};
  21.     int point3 []={100,200};

  22.     glPointSize(50);
  23.     glBegin(GL_POINTS);
  24.     glVertex2iv(point1);
  25.     glVertex2iv(point2);
  26.     glVertex2iv(point3);
  27.     glEnd();

  28.     glutSwapBuffers();
  29. }

  30. void changeSize(int w, int h) {
  31.     glutReshapeWindow(1920,1080);
  32.     GLint viewPort[4]={0};
  33.     glGetIntegerv(GL_VIEWPORT,viewPort);
  34.     qDebug()<<QString("In changeSize Func%1 %2 %3 %4")
  35.               .arg(viewPort[0]).arg(viewPort[1]).
  36.                arg(viewPort[2]).arg(viewPort[3]);

  37.     qDebug()<<QString::fromLocal8Bit("Current w is %1 and h is %2").arg(w).arg(h);

  38. }

  39. int main(int argc, char *argv[])
  40. {
  41.     QCoreApplication a(argc, argv);

  42.     glutInit(&argc,argv);
  43.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
  44.     glutInitWindowPosition(0,0);
  45.     glutInitWindowSize(1920,1080);

  46.     glutCreateWindow("An Example of OpenGL Program");

  47.     init();
  48.     glutDisplayFunc(lineSegment);
  49.     glutReshapeFunc(changeSize);
  50.     /*********尝试使用显示表*********/
  51.     const double TWO_PI =6.2831853;
  52.     GLuint regHex;

  53.     GLdouble theta;
  54.     GLint x,y,k;
  55.     //
  56.     regHex=glGenLists(1);
  57.     glNewList(regHex,GL_COMPILE);
  58.     glBegin(GL_POLYGON);
  59.     for (k=0;k<6;k++)
  60.     {
  61.         theta=TWO_PI*k/6.0;
  62.         x=200+150*cos(theta);
  63.         y=200+150*sin(theta);
  64.         glVertex2i(x,y);
  65.     }
  66.     glEnd();
  67.     glEndList();

  68.     glCallList(regHex);
  69.     /*********尝试使用显示表*********/
  70.     glutMainLoop();
  71.     GLint viewPort[4]={0};
  72.     glGetIntegerv(GL_VIEWPORT,viewPort);
  73.     qDebug()<<QString("Out of Space%1 %2 %3 %4").arg(viewPort[0]).arg(viewPort[1]).arg(viewPort[2]).arg(viewPort[3]);

  74.     return a.exec();
  75. }
复制代码

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-12-15 04:53 , Processed in 0.059140 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部