葱香花卷视频教程:舟--OpenGl编程的一个小问题?

来源:百度文库 编辑:高校问答 时间:2024/05/02 18:52:02
void GLUTCALLBACK changeSize(int w,int h)
{
cout<<"改变大小"<<endl;
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(50,w/h,0.1,100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
当在主函数中用这个函数(用glutReshapeFunc(changeSize);)调用上面这段代码时,窗口里面什么也没有,但是把这个函数注掉后,什么问题也没有,窗口显示正常.非常奇怪,上面这段代码,我照抄书上的,所以错误在哪不知道.
///////////////////////////////////
下面是整个的程序代码:
#include <windows.h>
#include <gl/glut.h>
#include <iostream.h>

#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glut32.lib")

float xRot=0;
float yRot=0;
float xTranslate=0;
float yTranslate=0;
float step=5;
float step_t=0.1;
float light_switch=TRUE;
float light_x=0.8;
float light_y=0.8;

void Init()
{
cout<<"初始化窗口"<<endl;

float ambientLight[]={0.7,0.7,0.7,1};
float diffuseLight[]={0.2,0.2,0.2,1};
float lightPosition[]={light_x,light_y,-0.6,1};
float specular[]={0.2,0.5,0.4,1};
float material[]={0.2,0.6,0.6};

glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_COLOR_MATERIAL);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);
glMaterialfv(GL_FRONT,GL_AMBIENT,material);
glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuseLight);
glMaterialfv(GL_FRONT,GL_SPECULAR,specular);

glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

glClearColor(1.0f,0.0f,1.0f,1.0f);

}

void GLUTCALLBACK changeSize(int w,int h)
{
cout<<"改变大小"<<endl;
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(50,w/h,0.1,100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void GLUTCALLBACK drawScene()
{
cout<<"画场景"<<endl;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

if(light_switch==FALSE)
{
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
}
else
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}

glRotatef(xRot,1,0,0);
glRotatef(yRot,0,1,0);

glTranslatef(xTranslate,yTranslate,0);

glColor3f(0,0.5,0.6);
glutSolidTeapot(0.5);

glutSwapBuffers();
}

void main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowPosition(200,200);
glutInitWindowSize(500,500);
glutCreateWindow("3");

Init();

// glutReshapeFunc(changeSize);
glutDisplayFunc(drawScene);

glutMainLoop();
}
坚决不是,我可以肯定一点,不是驱动的事
我找到了,原来是视点沿Z轴移动一下即可!呵呵!

10月17日 20:50 可能是驱动有问题
我刚装xp时,xp自带的驱动,opengl模式下魔兽就不能正常显示
我装回原来的驱动,虽然旧一点儿,但是很正常
现在下载了一个新的公版驱动,不错
建议更新一下驱动,在网上一搜就能搜到