您的位置:首页 > 其它

简单的光照模型

2011-10-17 21:19 232 查看
看了康玉之大牛的《GPU 编程与CG 语言之阳春白雪下里巴人》,和放风筝的程序员的博客,自己也来写写光照模型

1. Lambert光照模型,也就是漫反射光照模型。它考虑的是ambient光和diffuse光对物体的综合影响

主程序

#include <stdio.h>
#include <gl/glut.h>
#include <cg/cg.h>
#include <cg/cgGL.h>
#pragma comment(lib,"cg.lib")
#pragma comment(lib,"cgGL.lib")

#define WINDOW_SIZE 800

static CGcontext Context = NULL;
static CGprogram VertexProgram = NULL;
static CGprogram FragementProgram = NULL;
static CGprofile VertexProfile;
static CGprofile FragementProfile;

static CGparameter globalAmbient = NULL;
static CGparameter eyePosition = NULL;
static CGparameter lightPosition = NULL;
static CGparameter lightColor = NULL;
static CGparameter Kd = NULL;
static CGparameter Ks = NULL;
static CGparameter shininess = NULL;

void init()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);

//-------------------------------cg init-------------------------------------------------------
Context = cgCreateContext();
//顶点程序
VertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);
VertexProgram = cgCreateProgramFromFile(Context,CG_SOURCE, "lightmodle.cg",VertexProfile,"main_v", NULL);
cgGLLoadProgram(VertexProgram);
//片段程序
FragementProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
FragementProgram = cgCreateProgramFromFile(Context,CG_SOURCE, "lightmodle.cg",FragementProfile,"main_f", NULL);
cgGLLoadProgram(FragementProgram);

globalAmbient = cgGetNamedParameter(FragementProgram, "globalAmbient");
eyePosition = cgGetNamedParameter(FragementProgram, "eyePosition");
lightPosition = cgGetNamedParameter(FragementProgram, "lightPosition");
lightColor = cgGetNamedParameter(FragementProgram, "lightColor");
Kd = cgGetNamedParameter(FragementProgram, "Kd");
Ks = cgGetNamedParameter(FragementProgram, "Ks");
shininess = cgGetNamedParameter(FragementProgram, "shininess");
}

void display()
{
cgGLEnableProfile(VertexProfile);
cgGLEnableProfile(FragementProfile);
cgGLBindProgram(VertexProgram);
cgGLBindProgram(FragementProgram);

cgGLSetParameter3f(globalAmbient, 0.2, 0.2, 0.2);//环境光暗灰色
cgGLSetParameter3f(eyePosition, 0.0, 0.0, 0.0);//视点位置
cgGLSetParameter3f(lightPosition, 0.0, 0.0, 1.0);//光源放在正前面
cgGLSetParameter3f(lightColor, 1.0, 1.0, 1.0);//明亮的白色的点光源
cgGLSetParameter3f(Kd, 0.8, 0.8, 0.8);//材料对光的反射属性
cgGLSetParameter3f(Ks, 1.0, 1.0, 1.0);//材质的镜面反射系数
cgGLSetParameter1f(shininess, 20);//高光指数
cgGLEnableProfile(FragementProfile);

static float rotate=0.0;
rotate+=0.1;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0,0.0,-6.0);
glRotatef(30,1.0,0.0,0.0);
glRotatef(rotate,0.0,1.0,0.0);
glutSolidTeapot(1.0);
cgGLDisableProfile(VertexProfile);
cgGLDisableProfile(FragementProfile);

glutSwapBuffers();
}

void reshape(int w,int h)
{
if (h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.01f,400.0f);
glMatrixMode(GL_MODELVIEW);
}

int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutCreateWindow(argv[0]);
glutReshapeWindow(WINDOW_SIZE,WINDOW_SIZE);

glutDisplayFunc(display);
glutIdleFunc(display);
glutReshapeFunc(reshape);

init();
glutMainLoop();
cgDestroyProgram(VertexProgram);
cgDestroyProgram(FragementProgram);
cgDestroyContext(Context);
return 0;
}


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: