简单的光照模型
2011-10-17 21:19
232 查看
看了康玉之大牛的《GPU 编程与CG 语言之阳春白雪下里巴人》,和放风筝的程序员的博客,自己也来写写光照模型
1. Lambert光照模型,也就是漫反射光照模型。它考虑的是ambient光和diffuse光对物体的综合影响
主程序
效果图:
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; }
效果图:
相关文章推荐
- 简单光照模型(Lambert 光照模型)
- 简单整理了下光照模型的知识结构
- Directx教程(29) 简单的光照模型(8)
- 知识汇总二(简单光照模型)
- 学习了下简单的光照模型
- Unity Shaders and Effects Cookbook (3-2) 创建简单的 Phong 高光 光照模型
- 简单光照模型(Phong模型(镜面反射)与 Blinn-Phong光照模型(修正镜面光) )
- 简单的光照模型
- Directx11教程(29) 简单的光照模型(8)
- Directx教程(28) 简单的光照模型(7)
- Directx教程(27) 简单的光照模型(6)
- 新手思路——phong简单光照模型绘制
- Directx教程(22) 简单的光照模型(1)
- 学习了下简单的光照模型
- 简单的光照模型
- Directx教程(23) 简单的光照模型(2)
- 几个简单的各向异性光照模型
- 学习笔记——基本光照模型简单实现
- Directx教程(24) 简单的光照模型(3)
- 透明光照模型与环境贴图之3:简单透明光照模型