MFC下OpenGL关于Fog的练习——1

本文介绍如何在MFC框架下实现OpenGL编程中的雾效果。通过实例演示了设置光线和雾参数的方法,并展示了如何使用键盘切换不同的雾模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人菜鸟,今天把红宝书上的几个opengl的例子练习了一下,关于雾的,搞来搞去,中间有些小问题,不过都解决了,当然我是在MFC下编程编写的。

首先,要先感谢洞庭散人(Phinecos),如何在MFC框架下进行OpenGL编程,我就是从他的博客里边学到的。《基于MFC的OpenGL编程》系列文章,有兴趣可以去看看,比较容易上手。

像往常一样,我开始联系opengl编程的话,首先打开“《基于MFCOpenGL编程》Part 2 Setting up OpenGL on Windows”,把这里面的基本步骤先弄完。然后,拿着红宝书就开始敲代码。其实嘛,SGI网站上是有源代码的,不过初学者还是自己敲一下,记忆深刻点。

一切准备妥当,就可以开始了。

第一个例子,就是画五个球那个程序。(下面贴的主要代码,至于增加的变量,贴在最后,或者本人太懒的话就不贴了)
1.新创建一个函数void COpenGLDemo20100319View::LightAndFog(void)

 

设置光线和雾
void COpenGLDemo20100319View::LightAndFog( void )
{
GLfloat position[]
= { 0.5f , 0.5f , 3.0f , 0.0f };
glLightfv(GL_LIGHT0,GL_POSITION,position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

{
GLfloat mat[
3 ] = { 0.1745f , 0.01175f , 0.01175f };
glMaterialfv(GL_FRONT,GL_AMBIENT,mat);
mat[
0 ] = 0.61424f ;
mat[
1 ] = 0.04136f ;
mat[
2 ] = 0.04136f ;
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat);
mat[
0 ] = 0.727811f ;
mat[
1 ] = 0.626959f ;
mat[
2 ] = 0.626959f ;
glMaterialfv(GL_FRONT,GL_SPECULAR,mat);
glMaterialf(GL_FRONT,GL_SHININESS,
0.6 * 128.0 );
}

glEnable(GL_FOG);
{
GLfloat fogColor[
4 ] = { 0.5f , 0.5f , 0.5f , 1.0f };
fogMode
= GL_EXP;
glFogi(GL_FOG_MODE,fogMode);
glFogfv(GL_FOG_COLOR,fogColor);
glFogf(GL_FOG_DENSITY,
0.35 );
glHint(GL_FOG_HINT,GL_DONT_CARE);
glFogf(GL_FOG_START,
1.0f );
glFogf(GL_FOG_END,
5.0f );
}
}

 

 

 2.在OnCreate()函数内调用LightAndFog()进行初始化

代码
int COpenGLDemo20100319View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == - 1 )
return - 1 ;

// TODO: Add your specialized creation code here
InitializeOpenGL();
LightAndFog();
Create2DTextLists();//在屏幕上显示雾的MODE,剽窃了下洞庭散人博客里的代码,再次感谢
return 0 ;
}

3.贴上函数Create2DTextLists()的代码先

 
void COpenGLDemo20100319View::Create2DTextLists( void )
{
CFont m_font;
m_font.CreateFont(
- 24 , // Height Of Font
0 , // Width Of Font
0 , // Angle Of Escapement
0 , // Orientation Angle
FW_NORMAL, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
DEFAULT_QUALITY, // Output Quality
FF_DONTCARE | DEFAULT_PITCH, // Family And Pitch
" Algerian " );
CFont
* m_pOldFont = m_pDC -> SelectObject( & m_font);
// create display lists for glyphs 0 through 255 with 0.1 extrusion
// and default deviation. The display list numbering starts at 1000
// (it could be any number)
m_2DTextList = glGenLists( 256 );
wglUseFontBitmaps(m_pDC
-> GetSafeHdc(), 0 , 255 , m_2DTextList);
m_pDC
-> SelectObject(m_pOldFont);
}

4.进入RenderScene()进行编写

 
void COpenGLDemo20100319View::RenderScene( void )
{
glPushMatrix();

glPushMatrix();
// Position The Text On The Screen
glDisable(GL_LIGHTING);
glTranslatef(
- 1.0 , 0.0 , - 2.0f );
glColor3f(
1.0f , 1.0f , 0.0f );
glRasterPos2f(
0 , 0 );
glListBase(m_2DTextList);
glCallLists(fogModeString.GetLength(), GL_UNSIGNED_BYTE ,fogModeString);
glEnable(GL_LIGHTING);
glPopMatrix();

glTranslatef(
1.0f , 0.0f , - 2.0f );
RenderSphere(
- 2.0f , - 0.5f , - 1.0f );//就是个画球的小函数,下面贴上代码
RenderSphere(
- 1.0f , - 0.5f , - 2.0f );
RenderSphere(
0.0f , - 0.5f , - 3.0f );
RenderSphere(
1.0f , - 0.5f , - 4.0f );
RenderSphere(
2.0f , - 0.5f , - 5.0f );

glPopMatrix();
}

5.画球

void COpenGLDemo20100319View::RenderSphere(GLfloat x, GLfloat y, GLfloat z)
{
glPushMatrix();
glTranslatef(x,y,z);
glutSolidSphere(
0.4f , 16 , 16 );
glPopMatrix();
}

 6.咱来鼠标切换切换模式吧

 
void COpenGLDemo20100319View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case ' F ' :
case ' f ' :
if (fogMode == GL_EXP)
{
fogMode
= GL_EXP2;
fogModeString.Format(
" Fog mode is GL_EXP2. " );
}
else if (fogMode == GL_EXP2)
{
fogMode
= GL_LINEAR;
fogModeString.Format(
" Fog mode is GL_LINEAR. " );
}
else if (fogMode == GL_LINEAR)
{
fogMode
= GL_EXP;
fogModeString.Format(
" Fog mode is GL_EXP. " );
}
glFogi(GL_FOG_MODE,fogMode);
InvalidateRect(NULL,FALSE);
break ;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

7.增加的变量

public :
GLint fogMode;
GLuint m_2DTextList;
CString fogModeString;

 

 F5,我用的是VS2005,一切OK,正常运行。途中没遇到什么阻力,正常运行了。上述是凭我的记忆写的步骤,呵呵,没有去再次验证过。

 效果图也来几张吧。

 

转载于:https://www.cnblogs.com/unsigned/archive/2010/03/19/1690093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值