C++ glviewport()在OpenGL中的使用

C++ glviewport()在OpenGL中的使用,c++,opengl,graphics,C++,Opengl,Graphics,我读了这篇文章,并且正确地执行了它 但是,我想应用一些更改。第一个更改是查看该圆的不同视图,例如仅显示圆的1/4。我知道这是由glViewPort(参数)完成的。但是,在更改参数后,什么也不会发生。我查看了很多论坛,想弄清楚为什么会出现这个问题,但我什么都搞不清楚 有人能给我解释更多关于这个和如何使用它吗?(了解问题发生的位置) 这是代码(最初写在上面) 代码: #包括 #包括 #包括 #包括 void init(void) { glClearColor(1.0,1.0,1.0,0.0); gl

我读了这篇文章,并且正确地执行了它

但是,我想应用一些更改。第一个更改是查看该圆的不同视图,例如仅显示圆的1/4。我知道这是由glViewPort(参数)完成的。但是,在更改参数后,什么也不会发生。我查看了很多论坛,想弄清楚为什么会出现这个问题,但我什么都搞不清楚

有人能给我解释更多关于这个和如何使用它吗?(了解问题发生的位置)

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

代码:

#包括
#包括
#包括
#包括
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_投影);
//glLoadIdentity();
gluOrtho2D(0.0200.0,0.0200.0);
//glViewport(0,0,250,250);
}
无效设置像素(闪烁x、闪烁y)
{
glBegin(总分);
glVertex2i(x,y);
格伦德();
}
空圈(){
int xCenter=100,yCenter=100,r=50;
int x=0,y=r;
int p=3/2-r;
glClear(GLU颜色缓冲位);
gl3f(1,0,0);

而(x默认GLUT REFORMATE函数使用窗口大小调用
glViewport()
。从:

如果未为窗口注册重塑回调,或将NULL传递给GLUTREGRAPEFUNC(以取消注册以前注册的回调),则将使用默认重塑回调。此默认回调将仅调用法线平面上的GLVIEW(0,0,宽度,高度)(如果存在覆盖,则在覆盖上调用)

由于您这么早就调用了
glViewport()
,因此在您进行调用后,窗口将成形,覆盖您指定的视口


您需要注册自己的重塑函数,并在那里使用所需的视口参数调用
glViewport()
,或者在
Circle()
函数的开头调用
glViewport()

默认GLUT重塑函数使用窗口大小调用
glViewport()

如果未为窗口注册重塑回调,或将NULL传递给GLUTREGRAPEFUNC(以取消注册以前注册的回调),则将使用默认重塑回调。此默认回调将仅调用法线平面上的GLVIEW(0,0,宽度,高度)(如果存在覆盖,则在覆盖上调用)

由于您这么早就调用了
glViewport()
,因此在您进行调用后,窗口将成形,覆盖您指定的视口


您需要注册自己的重塑函数,并在那里使用所需的视口参数调用
glViewport()
,或者在
Circle()
函数开始时调用
glViewport()

非常感谢您的回复。我在我的Circle()开始时调用了glViewport()函数,我看到了一些变化。问题是它现在只改变了圆的大小。例如,如果我设置glviewPort(0,0,200,200),我看到的圆比我设置glviewPort(0,0,100)时看到的圆大两倍。我想做的只是看到一个圆的一部分,例如它的一半。你能帮我吗?非常感谢你的回复。我在圆的开始()调用了glViewport()函数,我看到了一些变化。问题是它现在只改变了圆的大小。例如,如果我设置glviewPort(0,0,200,200),我看到的圆比我设置glviewPort(0,0,100)时看到的圆大两倍。我想做的是只看到圆的一部分,例如它的一半。你能帮我吗?谢谢
#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;
}