再读OpenGL红宝书(1-8章)【续】

26)光照模型有4部分:全局环境光,近视点或远视点,双面光照,镜面反射颜色是否和环境颜色,散射颜色分开。要指定全局环境光,可以如下:

GLfloat ambient[] = {0.3,0.3,0.3,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient);

顶点的镜面反射亮度取决于该点的法线,顶点相对于光源的方向以及顶点相对于视点的方向。要使用近视点,可以这样:glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);这就将视点放置在(0,0,0). glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE)启用双面光照。典型的光照计算中,分别计算环境光,散射光,镜面反射光和发射光的贡献,然后进行叠加,而在这之后进行纹理映射的话,镜面反射区可能被覆盖,为了解决这个问题,可以glLightModelfv(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR); 这样,每个顶点光照计算将产生两种颜色,主颜色和辅助颜色,前者包含所以非镜面反射光照的贡献,后者是所以镜面反射光照的总贡献。纹理映射的时候只将主颜色和纹理颜色混合起来,执行万纹理映射后,再将主颜色和纹理颜色的混合结果与辅助颜色混合起来。

27) 不同材质属性的示例:

200791801.jpg

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> void init( void )
{
GLfloatambient[]
= { 1.0 , 0.0 , 0.0 , 1.0 };
GLfloatdiffuse[]
= { 1.0 , 1.0 , 1.0 , 1.0 };
GLfloatspecular[]
= { 1.0 , 1.0 , 1.0 , 1.0 };
GLfloatposition[]
= { 0.0 , 3.0 , 2.0 , 0.0 };
GLfloatlmodel_ambient[]
= { 0.4 , 0.4 , 0.4 , 1.0 };
GLfloatlocal_view[]
= { 0.0 };

glClearColor(
0.0 , 0.1 , 0.1 , 0.0 );
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}

void display( void )
{
GLfloatno_mat[]
= { 0.0 , 0.0 , 0.0 , 1.0 };
GLfloatmat_ambient[]
= { 0.7 , 0.7 , 0.7 , 1.0 };
GLfloatmat_ambient_color[]
= { 0.8 , 0.8 , 0.2 , 1.0 };
GLfloatmat_diffuse[]
= { 0.1 , 0.5 , 0.8 , 1.0 };
GLfloatmat_specular[]
= { 1.0 , 1.0 , 1.0 , 1.0 };
GLfloatno_shininess[]
= { 0.0 };
GLfloatlow_shininess[]
= { 5.0 };
GLfloathigh_shininess[]
= { 100.0 };
GLfloatmat_emission[]
= { 0.3 , 0.2 , 0.2 , 0.0 };

glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT);

/* drawsphereinfirstrow,firstcolumn
*diffusereflectiononly;noambientorspecular
*/
glPushMatrix();
glTranslatef(
- 3.75 , 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinfirstrow,secondcolumn
*diffuseandspecularreflection;lowshininess;noambient
*/
glPushMatrix();
glTranslatef(
- 1.25 , 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinfirstrow,thirdcolumn
*diffuseandspecularreflection;highshininess;noambient
*/
glPushMatrix();
glTranslatef(
1.25 , 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinfirstrow,fourthcolumn
*diffusereflection;emission;noambientorspecularreflection
*/
glPushMatrix();
glTranslatef(
3.75 , 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinsecondrow,firstcolumn
*ambientanddiffusereflection;nospecular
*/
glPushMatrix();
glTranslatef(
- 3.75 , 0.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinsecondrow,secondcolumn
*ambient,diffuseandspecularreflection;lowshininess
*/
glPushMatrix();
glTranslatef(
- 1.25 , 0.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinsecondrow,thirdcolumn
*ambient,diffuseandspecularreflection;highshininess
*/
glPushMatrix();
glTranslatef(
1.25 , 0.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinsecondrow,fourthcolumn
*ambientanddiffusereflection;emission;nospecular
*/
glPushMatrix();
glTranslatef(
3.75 , 0.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinthirdrow,firstcolumn
*coloredambientanddiffusereflection;nospecular
*/
glPushMatrix();
glTranslatef(
- 3.75 , - 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinthirdrow,secondcolumn
*coloredambient,diffuseandspecularreflection;lowshininess
*/
glPushMatrix();
glTranslatef(
- 1.25 , - 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinthirdrow,thirdcolumn
*coloredambient,diffuseandspecularreflection;highshininess
*/
glPushMatrix();
glTranslatef(
1.25 , - 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

/* drawsphereinthirdrow,fourthcolumn
*coloredambientanddiffusereflection;emission;nospecular
*/
glPushMatrix();
glTranslatef(
3.75 , - 3.0 , 0.0 );
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glutSolidSphere(
1.0 , 16 , 16 );
glPopMatrix();

glFlush();
}


28)颜色材质模式,

glColorMaterial(GL_FRONT, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL);这将导致正面的DIFFUSE总是设置为当前颜色

29)混合时,首先指定源因子和目标因子,然后按照公式进行混合(默认的操作是相加),设置因子有两种方式:glBlenFunc()glBlendFuncSeparate()(它可以指定4个因子,即可以使用不同的方式来混合RGBalpha值)。除了默认的加法外,还可以使用glBlendEquation()来指定其他的混合方式(如减法等)。

30 启用反走样功能:glEnable(GL_POINT_SMOOTH)glEnable (GL_LINE_SMOOTH);glEnable (GL_BLEND);或者采用glHint(),例如:

glEnable (GL_LINE_SMOOTH);

glEnable (GL_BLEND);

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);

31)雾的效果示例:

200791803.jpg

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> static GLintfogMode;

/* Initializedepthbuffer,fog,lightsource,
*materialproperty,andlightingmodel.
*/
static void init( void )
{
GLfloatposition[]
= { 0.5 , 0.5 , 3.0 , 0.0 };

glEnable(GL_DEPTH_TEST);

glLightfv(GL_LIGHT0,GL_POSITION,position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
{
GLfloatmat[
3 ] = { 0.1745 , 0.01175 , 0.01175 };
glMaterialfv(GL_FRONT,GL_AMBIENT,mat);
mat[
0 ] = 0.61424 ;mat[ 1 ] = 0.04136 ;mat[ 2 ] = 0.04136 ;
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat);
mat[
0 ] = 0.727811 ;mat[ 1 ] = 0.626959 ;mat[ 2 ] = 0.626959 ;
glMaterialfv(GL_FRONT,GL_SPECULAR,mat);
glMaterialf(GL_FRONT,GL_SHININESS,
0.6 * 128.0 );
}

glEnable(GL_FOG);
{
GLfloatfogColor[
4 ] = { 0.5 , 0.5 , 0.5 , 1.0 };

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.0 );
glFogf(GL_FOG_END,
5.0 );
}
glClearColor(
0.5 , 0.5 , 0.5 , 1.0 ); /* fogcolor */
}

static void renderSphere(GLfloatx,GLfloaty,GLfloatz)
{
glPushMatrix();
glTranslatef(x,y,z);
glutSolidSphere(
0.4 , 16 , 16 );
glPopMatrix();
}

/* display()draws5spheresatdifferentzpositions.
*/
void display( void )
{
glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT);
renderSphere(
- 2 ., - 0.5 , - 1.0 );
renderSphere(
- 1 ., - 0.5 , - 2.0 );
renderSphere(
0 ., - 0.5 , - 3.0 );
renderSphere(
1 ., - 0.5 , - 4.0 );
renderSphere(
2 ., - 0.5 , - 5.0 );
glFlush();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值