我阅读了此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;
}


ps:在某些示例中,我看到它们在使用glViewPort(parameters)之前先使用setWindow(parameters)。但是setWindow()需要的库对于ubuntu不可用。

最佳答案

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


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


由于您这么早调用了glViewport(),因此在调用后将调整窗口的形状,从而覆盖您指定的视口。

您要么需要注册自己的重塑函数,然后在其中使用所需的视口参数调用glViewport(),要么在glViewport()函数的开始处调用Circle()

10-08 03:06