OpenGL材质的应用

这次把材质完全搞定,呵呵
	上次12个不同的立体材质球的程序运用glMaterialfv()来改变材质有其固有的系统消耗。

另外同样的功能可以使用:
void glColorMaterial(GLenum face,GLenum mode)来实现。
face的取值:
GL_FRONT GL_BACK GL_FRONT_AND_BACK
mode的取值:
GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION

	在想要使用这个函数时,要启用glEnable(GL_COLOR_MATERIAL)来是函数工作在绘图时使用glColor*()来改变材质颜色,或用glMaterial()来改变材质成分
使用完毕,要用glDisable(GL_COLOR_MATERIAL)来关闭这种材质模式。

例如:
glColorMaterial(GL_FRONT,GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

glColor3f(0.3,0.5,0.7);
//画一些物体:
...

glColor3f(0.0,1.0,0.0);
//再画另一些物体:
...

glDisable(GL_COLOR_MATERIAL);

说明:
当需要改变场景中大部分方面的单个材质时,最好调用glColorMaterial()
当修改不只一个材质参数,最好调用glMaterial*(),这是目前我体会到唯一的使用功能上的不同点吧。
请看下面例子:

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA


/
//sample.cpp
void myinit(void);
void CALLBACK  display(void);
void CALLBACK  reshape(GLsizei w,GLsizei h);

void myinit(void)
{
	auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
	auxInitPosition(0,0,500,500);
	auxInitWindow("sample1");
	glClearColor(0.0,0.1,0.1,0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	//      glShadeModel(GL_FLAT);
	
	//定义一个白色简单光源
	GLfloat light_position[]={0.0,3.0,2.0,0.0};
	glLightfv(GL_LIGHT0,GL_POSITION,light_position);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	
	//启用消隐
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	
	//启用颜色材质模式
	glColorMaterial(GL_FRONT,GL_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);
}

void CALLBACK reshape(GLsizei w,GLsizei h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<=h)
		glOrtho(-6.0,6.0,-6.0*(GLfloat)h/(GLfloat)w,
			6.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
	else
		glOrtho(-6.0*(GLfloat)h/(GLfloat)w,
			6.0*(GLfloat)h/(GLfloat)w,-6.0,6.0,-10.0,10.0);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void CALLBACK display(void)
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	
	//先画一个黄色材质的球
	glLoadIdentity();
	glTranslatef(-0.7,0.0,0.0);
	glColor3f(1.0,1.0,0.0);
	auxSolidSphere(1.0);
	
	//再在黄球的右边2.7处画一个红色的球
	glLoadIdentity();
	glRotatef(-60.0,1.0,0.0,0.0);
	glTranslatef(2.7,0.0,0.0);
	glColor3f(1.0,0.0,0.0);
	auxSolidSphere(1.0);
	
	//再再黄球左边(两球之间)靠后的位置画一个青色三角锥
	glLoadIdentity();
	glTranslatef(-1.0,-1.0,-5.0);
	glRotatef(30.0,1.0,0.0,0.0);
	glColor3f(0.0,1.0,1.0);
	auxSolidCone(2.0,2.0);
	
    glFlush();
}
void main(void)
{
    myinit();
    
    auxReshapeFunc(reshape);
    auxMainLoop(display);
}
//end of sample


	通过这个例子,我们除了可以熟悉glColorMaterial()的使用,还可以体会到OPENGL在消隐方面为我们做的工作。记的我们前面的用彩色平面
绘制三角锥的例子吗?那里可是哪个平面后画,哪个平面遮挡以前的平面。
	这里我们看到虽然三角锥虽然最后画出,但是OPENGL的消隐功能已经保证乐它实际应该被消隐。你可以试试取消myinit()中消隐的两句程序,那么
三角锥就跑到前面来乐,呵呵。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值