在 OpenGL 中使用 glviewport()

Posted

技术标签:

【中文标题】在 OpenGL 中使用 glviewport()【英文标题】:using of glviewport() in OpenGL 【发布时间】:2017-03-03 17:04:20 【问题描述】:

我阅读了这个tutorial 并正确执行了它。

但是,我想应用一些更改。第一个更改是查看该圆的不同视图,例如仅显示圆的 1/4。我知道这是由 glViewPort(parameters) 完成的。但是,更改参数后,没有任何反应。我查了很多论坛,想知道为什么会出现这个问题,但我什么也想不通。

有人可以详细解释一下这个以及如何使用它吗? (了解问题发生在哪里)

这是代码(最初写在tutorial上)

代码:

#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void init(void)

  glClearColor(1.0,1.0,1.0,0.0);
  glMatrixMode(GL_PROJECTION);
  //glLoadIdentity();
  gluOrtho2D(0.0,200.0,0.0,200.0);
  //glViewport(0, 0, 250, 250);



void setPixel(GLint x,GLint y)

  glBegin(GL_POINTS);
  glVertex2i(x,y);
  glEnd();


void Circle()

  int xCenter=100,yCenter=100,r=50;
  int x=0,y=r;
  int p = 3/2 - r;
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f( 1 ,0, 0);
  while(x<=y)
    setPixel(xCenter+x,yCenter+y);
    setPixel(xCenter+y,yCenter+x);
    setPixel(xCenter-x,yCenter+y);
    setPixel(xCenter+y,yCenter-x);
    setPixel(xCenter-x,yCenter-y);
    setPixel(xCenter-y,yCenter-x);
    setPixel(xCenter+x,yCenter-y);
    setPixel(xCenter-y,yCenter+x);

    if (p<0)
  p += (2*x)+3;
    else 
 p += (2*(x-y))+5;
 y -= 1;
    
    x++;
  

  glFlush();


int main(int argc,char **argv)
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(0,0);
    glutInitWindowSize(500,500);


    glutCreateWindow("My Circl2e");
    init();

    glViewport(0,0,250,250);
    //glLoadIdentity();

    glutDisplayFunc(Circle);

    glutMainLoop();
    return 0;

p.s:在某些示例中,我看到他们在使用 glViewPort(parameters) 之前使用 setWindow(parameters)。但是 setWindow() 需要 ubuntu 不可用的库。

【问题讨论】:

【参考方案1】:

默认的 GLUT reshape 函数使用窗口大小调用 glViewport()。来自documentation:

如果未为窗口注册重塑回调或将 NULL 传递给 glutReshapeFunc(以取消注册先前注册的回调),则使用默认的重塑回调。这个默认回调将简单地在法线平面上调用 glViewport(0,0,width,height) (如果存在,则在覆盖层上)。

由于您这么早就调用glViewport(),所以在您拨打电话后,窗口将被塑造,覆盖您指定的视口。

您要么需要注册自己的 reshape 函数,并在此处使用所需的视口参数调用 glViewport(),要么在 Circle() 函数的开头调用 glViewport()

【讨论】:

非常感谢您的回复。我在 circle() 函数开始时调用了 glViewport(),我看到发生了一些变化。问题是它现在只是改变了圆圈的大小。例如,如果我设置 glviewPort(0, 0, 200, 200),我看到的圆圈是我设置为 glViewport(0, 0, 100) 时的两倍。我想做的只是看到一个圆圈的一部分,例如它的一半。你能帮我解决这个问题吗?谢谢

以上是关于在 OpenGL 中使用 glviewport()的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 正交投影矩阵,glViewport

OpenGL的glViewport视口变换函数详解[转]

OpenGL FrameBuffer 和 glViewport

SDL 重置 glViewport

链接GLEW等,_glViewport是唯一未解决的

在OpenGL中撕裂?