|
|
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
;
}
//---------------------------------------------------------------------------
void TForm1: rawOpengl()
{
HDC hDC;
glEnable(GL_TEXTURE_2D);
aspect =(GLfloat)1024/(GLfloat)768;
glClearColor(0.0f,0.0f,0.0f,0.5f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
glLoadIdentity();
gluPerspective(45.0f,aspect,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
// 后面
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
// 顶面
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
// 底面
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
// 右面
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;
glPopMatrix();
glFlush();
hDC=wglGetCurrentDC();
SwapBuffers(hDC);
glEnd();
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0,
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0
};
HDC hDC=GetDC(Form1->Handle);
LoadGLTextures();
int iPixelFormat;
iPixelFormat=ChoosePixelFormat(hDC,&pfd);
SetPixelFormat(hDC,iPixelFormat,&pfd);
DescribePixelFormat(hDC,iPixelFormat,sizeof(PIXELFORMATDESCRIPTOR),&pfd);
m_hRC=wglCreateContext(hDC);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
HDC hDC=GetDC(this->Handle);
wglMakeCurrent( NULL, NULL );
wglDeleteContext( m_hRC );
ReleaseDC(this->Handle,hDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
HDC hDC=GetDC(this->Handle);
wglMakeCurrent(hDC,m_hRC);
DrawOpengl();
wglMakeCurrent(hDC,NULL);
ReleaseDC(this->Handle,hDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_ESCAPE)
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
FormPaint(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
HDC hDC=GetDC(this->Handle);
wglMakeCurrent(hDC,m_hRC);
this->ClientHeight=(this->ClientHeight==0)? 1:this->ClientHeight;
glViewport(0,0,this->ClientWidth,this->ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
ReleaseDC(this->Handle,hDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params); //调用原有函数预处理
Params.Style=WS_VISIBLE|WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;//加上必要的属性
ChangeResolution(1024,768,32);
Params.Width=1024;
Params.Height=768;
Params.X=Params.Y=0;
}
bool TForm1::ChangeResolution(int w, int h,int bitdepth)
{
DEVMODE devMode;
int modeSwitch;
int closeMode = 0;
EnumDisplaySettings(NULL, closeMode, &devMode);
devMode.dmBitsPerPel = bitdepth;
devMode.dmPelsWidth = w;
devMode.dmPelsHeight = h;
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
modeSwitch = ChangeDisplaySettings(&devMode, CDS_FULLSCREEN);
if(modeSwitch == DISP_CHANGE_SUCCESSFUL)
{
return true;
}
else
{
ChangeDisplaySettings(NULL, 0);
return false;
}
}
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 TForm1: oadGLTextures() //调用Bitmap并转换成纹理
{
int Status=FALSE; //状态确定
AUX_RGBImageRec *TextureImage[1]; //为纹理创建存储空间
memset(TextureImage,0,sizeof(void *)*1); //将指针设为NULL
//读取位图,检查错误。如果位图不存在则退出
if (TextureImage[0]=LoadBMP("J:/我的资料/程序设计作品/opengl5/Data/TX.bmp"))
{
Status=TRUE; //设Status为TRUE
glGenTextures(1, &texture[0]); //创建纹理
//用位图中的数据进行典型的纹理生成
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) //纹理是否存在
{
if (TextureImage[0]->data) //纹理图象是否存在
{
free(TextureImage[0]->data); //释放纹理图象所占用内存
}
free(TextureImage[0]); //释放图象结构
}
return Status; //返回Status的值
}
我用CB6写了OPENGL贴纹理的程序,为什么总是出现
[Linker Error] Unresolved external 'TForm1::LoadBMP(char *)' referenced from J:\程序设计作品\OPENGL5\UNIT1.OBJ
这是什么问题呢,哪位老大能告诉我一下吗?谢谢!! |
|