77范文网 - 专业文章范例文档资料分享平台

Qt+OpenGL中文教程(5)

来源:网络收集 时间:2020-04-03 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

}

这里也和上一课一样,主要还是画一个立方体。

void NeHeWidget::initializeGL() {

loadGLTextures();

glEnable( GL_TEXTURE_2D ); glShadeModel( GL_SMOOTH );

glClearColor( 0.0, 0.0, 0.0, 0.5 ); glClearDepth( 1.0 );

glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL );

glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

glLightfv( GL_LIGHT1, GL_AMBIENT, lightAmbient ); glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse ); glLightfv( GL_LIGHT1, GL_POSITION, lightPosition );

glEnable( GL_LIGHT1 ); 这里使用光源的方法和前面一样。 glColor4f( 1.0, 1.0, 1.0, 0.5 ); glBlendFunc( GL_SRC_ALPHA, GL_ONE );

上面第一行以全亮度绘制此物体,并对其进行50%的alpha融合(半透明)。当融合选项打开时,此物体将会产生50%的透明效果。上面第二行设置所采用的融合类型。

Rui Martins的补充:alpha通道的值为0.0意味着物体材质是完全透明的。1.0则意味着完全不透明。

}

void NeHeWidget::keyPressEvent( QKeyEvent *e ) {

switch ( e->key() ) {

case Qt::Key_L: light = !light; if ( !light ) {

glDisable( GL_LIGHTING ); }

else {

glEnable( GL_LIGHTING ); }

updateGL(); break;

case Qt::Key_B: blend = !blend; if ( blend ) {

glEnable( GL_BLEND );

glDisable( GL_DEPTH_TEST ); } else {

glDisable( GL_BLEND );

glEnable( GL_DEPTH_TEST ); }

updateGL(); break;

按下了B键,就可以切换是否启用融合方式。 case Qt::Key_F: filter += 1;; if ( filter > 2 ) {

filter = 0; }

updateGL(); break;

case Qt::Key_Prior: zoom -= 0.2; updateGL(); break;

case Qt::Key_Next: zoom += 0.2; updateGL(); break;

case Qt::Key_Up: xSpeed -= 0.01; updateGL(); break;

case Qt::Key_Down:

xSpeed += 0.01; updateGL(); break;

case Qt::Key_Right: ySpeed += 0.01; updateGL(); break;

case Qt::Key_Left: ySpeed -= 0.01; updateGL(); break;

case Qt::Key_F2:

fullscreen = !fullscreen; if ( fullscreen ) {

showFullScreen(); } else {

showNormal();

setGeometry( 0, 0, 640, 480 ); }

update(); break;

case Qt::Key_Escape: close(); } }

但是怎样才能在使用纹理贴图的时候指定融合时的颜色呢?很简单,在调整贴图模式时,文理贴图的每个象素点的颜色都是由alpha通道参数与当前地象素颜色相乘所得到的。比如,绘制的颜色是(0.5, 0.6, 0.4),我们会把颜色相乘得到(0.5, 0.6, 0.4, 0.2)(alpha参数在没有指定时,缺省为零)。 就是如此!OpenGL实现alpha融合的确很简单! 原文注 (1999年11月13日)

我(NeHe)融合代码进行了修改,以使显示的物体看起来更逼真。同时对源象素和目的象素使用alpha参数来融合,会导致物体的人造痕迹看起来很明显。 会使得物体的背面沿着侧面的地方显得更暗。基本上物体会看起来很怪异。我所用的融合方法也许不是最好的,但的确能够工作。启用光源之后,物体看起来很逼真。感谢Tom提供的原始代码,他采用的混色方法是正确的,但物体看起来并不象所期望的那样吸引人:)

代码所作的再次修改是因为在某些显卡上glDepthMask()函数存在寻址问题。这条命令在某些卡上启用或关闭深度缓冲测试时似乎不是很有效,所以我已经将启用或关闭深度缓冲测试的代码转成老式的glEnable和glDisable。 纹理贴图的alpha融合

用于纹理贴图的alpha参数可以象颜色一样从问题贴图中读取。方法如下,您需要在载入所需的材质同时取得其的alpha参数。然后在调用glTexImage2D()时使用GL_RGBA的颜色格式。 本课程的源代码。

[上一课:融合] [Qt OpenGL教程主页]

在三维空间中移动位图

欢迎进入第九课。到现在为止,您应该很好的理解OpenGL了。您已经学会了设置一个OpenGL窗口的每个细节。学会在旋转的物体上贴图并打上光线以及融合

(透明)处理。这一课应该算是第一课中级教程。您将学到如下的知识:在三维场景中移动位图,并去除位图上的黑色象素(使用融合)。接着为黑白纹理上色,最后您将学会创建丰富的色彩,并把上过不同色彩的纹理相互融合,得到简单的动画效果。

我们要在上一课的代码上进行改动就可以了。

我们将增加一些变量,稍后我们对这些变量进行解释。

NeHeWidget类

(由nehewidget.h展开。)

const GLuint num = 50; //常量num存储的是我们绘制的星星的总数

typedef struct //这个结构是用来存储星星的数据的 {

int r, g, b; // r、g、b存储的是星星的颜色 GLfloat dist; // dist是星星距离中心的距离 GLfloat angle; // angle是星星现在所在的角度 }stars;

protected:

void initializeGL(); void paintGL();

void resizeGL( int width, int height );

void keyPressEvent( QKeyEvent *e ); void loadGLTextures();

void timerEvent( QTimerEvent * );

增加了一个timeEvent( QTimerEvent * )函数,这个函数可以实现整个窗口部件的一些定时操作。

protected:

bool fullscreen;

GLfloat xRot, yRot, zRot;

GLfloat zoom; // zoom是星星距离观察者的距离 GLfloat tilt; // tilt是星星的倾角

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库Qt+OpenGL中文教程(5)在线全文阅读。

Qt+OpenGL中文教程(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/930971.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: