请教:OpenGL程序,总是有一个错误,这个错误提示是怎么回事啊?

byoneself 2006-11-23 06:25:30
请教大家:
下面是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; // 如果窗口未能创建,程序退出
}
}
}
}
...全文
780 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
byoneself 2006-11-24
  • 打赏
  • 举报
回复
原来的程序预订定义是这样的:
/********************************************************************************************************************************/

#include <windows.h> // Windows的头文件
#include "glew.h" // 包含最新的gl.h,glu.h库
//#include <glut.h> // 包含OpenGL实用库
/***********************************新添的代码***********************************************************************************/
#include <stdio.h> // 标准输入输出库头文件
#include "glaux.h" // GLaux库的头文件

编译运行后:

--------------------Configuration: PicFont - Win32 Debug--------------------
Compiling...
PicFont.cpp
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/PicFont.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

PicFont.exe - 2 error(s), 0 warning(s)

这是什么意思呢?是哪里没有连接上,调试程序没有连接上?
byoneself 2006-11-24
  • 打赏
  • 举报
回复
TO:syy64(太平洋)
#include <gl\glaux.h>已经加上了;再者,#include <gl\gl.h>与#include <gl\glu.h>都被包含在#include <gl\glut.h>里了,即使把它们都加上也是不能通过编译的...
syy64 2006-11-24
  • 打赏
  • 举报
回复
应该加上:
#include <gl\gl.h>
#include <gl\glaux.h>
#include <gl\glu.h>
byoneself 2006-11-24
  • 打赏
  • 举报
回复
不是.net的程序
syy64 2006-11-24
  • 打赏
  • 举报
回复
是否是.Net的程序,在vc++6.0下编译的?
laiwusheng 2006-11-23
  • 打赏
  • 举报
回复
代码好乱

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧