哪位给解释一下OpenGL框架。。。

来源:百度知道 编辑:UC知道 时间:2024/06/15 09:31:22
如题,我们老师个人很会编程不错,但是不会教书,直接导致我到现在仍然不知道OpenGL的工作流程,这里说的工作流程并不是光栅化啊逐个顶点操作或者三维观察流程或者二维观察流程之类的东西,而是指程序本身,函数本身的工作原理,比如MainLoop()到底循环的是哪些部分,哪些函数是重复执行的,这些函数的执行原理==,比如我今天想弄个最简单的观察函数gluPerspective(),设置第一个参数为变量,但是后面控制台打印出来变量本身没问题而显示窗口中的方块却闪了一下就没了,这样的问题很是郁闷,所以希望各位能解答一下。下面给出的是我上述的那个程序。
谢谢各位先了只能,我没分了。。。。
#include <math.h>
#include <GL/glut.h>

float x = 120.0,temp=1.0;

void init(void)
{
glMatrixMode(GL_PROJECTION);
gluPerspective(x,1,50,300);
printf("x=%f\n",x);
glutPostRedisplay();
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glBegin(GL_QUADS);
glVertex3f(100.0,100.0,-100.0);
glVertex3f(100.0,-100.0,-100.0);
glVertex3f(-100.0,-100.0,-100.0);
glVertex3f(-100.0,100.0,-100.0);
glEnd();

glMatrixMode(GL_PROJECTION);
gluPerspective(x,1,50,300);
printf("x=%f\n",x);
gl

闪一下就不见了那是因为这里有问题
glMatrixMode(GL_PROJECTION);
gluPerspective(x,1,50,300);

你打少了句
glLoadIdentity()

正确应该是这样的
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(x,1,50,300);

init函数里面也是,记得每次在修改矩阵时先调用glLoadIdentity();把矩阵初始化(如果你想它的效果累积起来那就不用了)
注意OPENGL的矩阵操作是有累积效果的

====================================
只改init当然没效果,因为你的display是被glut库调用多次的,所以你得在display函数里也做修改
gluPerspective修改的是投影矩阵,这个矩阵是在OPENGL内部维护的

好像一般投影矩阵只在init和resize时设置。
绘图时只操作模型视点矩阵,如果你是要改变视点似乎应该使用gluLookat()。
而且绘制图形时只在Draw的最初部分调用LoadIdentity()。如果你是要绘制好几个使用独立坐标的图形,应该在绘制每个图形前调用glPushMatrix(),画完再调用glPopMatrix()。