请教:OpenGL程序,总是有一个错误,这个错误提示是怎么回事啊?
请教大家:
下面是Jeff Molofee的一个OpenGL程序,可是我在编译时出现错误了:
--------------------Configuration: Stars - Win32 Debug--------------------
Compiling...
Stars.cpp
c:\program files\microsoft visual studio\vc98\include\gl\glew.h(66) : fatal error C1189: #error : gl.h included before glew.h
Error executing cl.exe.
Stars.exe - 1 error(s), 0 warning(s)
在OpenGL中gl.h(和glu.h)文件不是在glut.h中了吗?错误提示“gl.h included before glew.h”是说gl.h文件已经被包含在glew.h中(不需要glut.g根本就不行!)呢,还是说gl.h文件没有包含在glew.h文件里(应该给加进去?)?
具体应该怎么改正呢,有劳大家了……
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib")
#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )
#include <windows.h>
#include <stdio.h>
#include <GL\glut.h>
#include <GL\glaux.h>
#include <GL\glew.h>
#include <GL\wglew.h>
BOOL twinkle; // 闪烁的星星
BOOL tp; // 'T' 按下了么?
const num=50; // 绘制的星星数
typedef struct // 为星星创建一个结构
{
int r, g, b; // 星星的颜色
GLfloat dist; // 星星距离中心的距离
GLfloat angle; // 当前星星所处的角度
}
stars; // 结构命名为stars
stars star[num]; // 使用 'stars' 结构生成一个包含 'num'个元素的 'star'数组
GLfloat zoom=-15.0f; // 星星离观察者的距离
GLfloat tilt=90.0f; // 星星的倾角
GLfloat spin; // 闪烁星星的自转
GLuint loop; // 全局 Loop 变量
GLuint texture[1]; // 存放一个纹理
AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图文件
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确认已给出文件名
{
return NULL; // 若无返回 NULL
}
File=fopen(Filename,"r"); // 检查文件是否存在
if (File) // 文件存在么?
{
fclose(File); // 关闭文件句柄
return auxDIBImageLoad(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败返回 NULL
}
int LoadGLTextures() // 载入位图并转换成纹理
{
int Status=FALSE; // 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 为纹理分配存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,查错,如果未找到位图文件则退出
if (TextureImage[0]=LoadBMP("Data/Star.bmp"))
{
Status=TRUE; // 将 Status 设为TRUE
glGenTextures(1, &texture[0]); // 创建一个纹理
// 创建一个线性滤波纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
}
if (TextureImage[0]) // 如果纹理存在
{
if (TextureImage[0]->data) // 如果纹理图像存在
{
free(TextureImage[0]->data); // 释放纹理图像所占的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 Status的值
}
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
if (!LoadGLTextures()) // 调用纹理载入子例程
{
return FALSE; // 如果未能载入,返回FALSE
}
glEnable(GL_TEXTURE_2D); // 启用纹理映射
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // 设置混色函数取得半透明效果
glEnable(GL_BLEND); // 启用混色
for (loop=0; loop<num; loop++) // 创建循环设置全部星星
{
star[loop].angle=0.0f; // 所有星星都从零角度开始
star[loop].dist=(float(loop)/num)*5.0f; // 计算星星离中心的距离
star[loop].r=rand()%256; // 为star[loop]设置随机红色分量
star[loop].g=rand()%256; // 为star[loop]设置随机红色分量
star[loop].b=rand()%256; // 为star[loop]设置随机红色分量
}
return TRUE; // 初始化一切OK
}
int DrawGLScene(GLvoid) // 此过程中包括所有的绘制代码
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择纹理
for (loop=0; loop<num; loop++) // 循环设置所有的星星
{
glLoadIdentity(); // 绘制每颗星星之前,重置模型观察矩阵
glTranslatef(0.0f,0.0f,zoom); // 深入屏幕里面
glRotatef(tilt,1.0f,0.0f,0.0f); // 倾斜视角
glRotatef(star[loop].angle,0.0f,1.0f,0.0f); // 旋转至当前所画星星的角度
glTranslatef(star[loop].dist,0.0f,0.0f); // 沿X轴正向移动
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); // 取消当前星星的角度
glRotatef(-tilt,1.0f,0.0f,0.0f); // 取消屏幕倾斜
if (twinkle) // 启用闪烁效果
{
// 使用byte型数值指定一个颜色
glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255);
glBegin(GL_QUADS); // 开始绘制纹理映射过的四边形
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd(); // 四边形绘制结束
}
glRotatef(spin,0.0f,0.0f,1.0f); // 绕z轴旋转星星
// 使用byte型数值指定一个颜色
glColor4ub(star[loop].r,star[loop].g,star[loop].b,255);
glBegin(GL_QUADS); // 开始绘制纹理映射过的四边形
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
spin+=0.01f; // 星星的公转
star[loop].angle+=float(loop)/num; // 改变星星的自转角度
star[loop].dist-=0.01f; // 改变星星离中心的距离
if (star[loop].dist<0.0f) // 星星到达中心了么
{
star[loop].dist+=5.0f; // 往外移5个单位
star[loop].r=rand()%256; // 赋一个新红色分量
star[loop].g=rand()%256; // 赋一个新绿色分量
star[loop].b=rand()%256; // 赋一个新蓝色分量
}
}
return TRUE; // 一切正常
}
SwapBuffers(hDC); // 切换缓冲
if (keys['T'] && !tp) // 是否T 键已按下并且 tp值为 FALSE
{
tp=TRUE; // 若是,将tp设为TRUE
twinkle=!twinkle; // 翻转 twinkle的值
}
if (!keys['T']) // T 键已松开了么?
{
tp=FALSE; // 若是 ,tp为 FALSE
}
if (keys[VK_UP]) // 上方向键按下了么?
{
tilt-=0.5f; // 屏幕向上倾斜
}
if (keys[VK_DOWN]) // 下方向键按下了么?
{
tilt+=0.5f; // 屏幕向下倾斜
}
if (keys[VK_PRIOR]) // 向上翻页键按下了么
{
zoom-=0.2f; // 缩小
}
if (keys[VK_NEXT]) // 向下翻页键按下了么?
{
zoom+=0.2f; // 放大
}
if (keys[VK_F1]) // F1键按下了么?
{
keys[VK_F1]=FALSE; // 若是,使对应的Key数组中的值为 FALSE
KillGLWindow(); // 销毁当前的窗口
fullscreen=!fullscreen; // 切换 全屏 / 窗口 模式
// 重建 OpenGL 窗口
if (!CreateGLWindow("NeHe's 透明纹理实例",640,480,16,fullscreen))
{
return 0; // 如果窗口未能创建,程序退出
}
}
}
}