原创 OpenGL学习笔记——04

2009-7-13 16:59 3344 8 11 分类: 软件与OS

点击开大图


第1行第1列,只有漫反射,没有环境光反射和镜面反射
第1行第2列,有漫反射和镜面反射,低光泽度,无环境光反射
第1行第3列,有漫反射和镜面反射,高光泽度,无环境光反射
第1行第4列,有漫反射和发射光,无环境光反射和镜面反射

第2行第1列,有环境光反射和漫反射,无镜面反射
第2行第2列,有环境光反射、漫反射、镜面反射,低光泽度
第2行第3列,有环境光反射、漫反射、镜面反射,高光泽度
第2行第4列,有环境光反射、漫反射、发射光,无镜面反射

第3行第1列,有环境光反射和漫反射,无镜面反射
第3行第2列,有环境光反射、漫反射、镜面反射,低光泽度
第3行第3列,有环境光反射、漫反射、镜面反射,高光泽度
第3行第4列,有环境光反射、漫反射、发射光,无镜面反射

源代码如下:
#include <GL/glut.h>
#include <stdlib.h>
void init()
{
GLfloat ambient[]={0.0, 0.0, 0.0, 1.0};
GLfloat diffuse[]={1.0, 1.0, 1.0, 1.0};
GLfloat specular[]={1.0, 1.0, 1.0, 1.0};
GLfloat position[]={0.0, 3.0, 2.0, 0.0};
GLfloat lmodel_ambient[]={0.4, 0.4, 0.4, 1.0};
GLfloat local_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)
{
GLfloat no_mat[]={0.0, 0.0, 0.0, 1.0};
GLfloat mat_ambient[]={0.7, 0.7, 0.7, 1.0};
GLfloat mat_ambient_color[]={0.8, 0.8, 0.2, 1.0};
GLfloat mat_diffuse[]={0.1, 0.5, 0.8, 1.0};
GLfloat mat_specular[]={1.0, 1.0, 1.0, 1.0};
GLfloat no_shininess[]={0.0};
GLfloat low_shininess[]={5.0};
GLfloat high_shininess[]={100.0};
GLfloat mat_emission[]={0.3, 0.2, 0.2, 0.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
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, 64, 64);
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w <= (h*2))
  glOrtho(-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w, 3.0*((GLfloat)w/(GLfloat)h*2), -10.0, 10.0);
else
  glOrtho(-6.0*(GLfloat)w/((GLfloat)h*2), 6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpenGL Test");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

文章评论3条评论)

登录后参与讨论

用户377235 2013-1-24 12:30

不错,喔总算看懂了

tengjingshu_112148725 2009-7-14 09:21

关注

用户124183 2009-7-13 18:22

其实之前就将《OpenGL编程指南(第4版)》通看过一遍,所以再回来边看边练习就快好多,呵呵

zhangshaobing517_935512703 2009-7-13 18:15

你学的挺快啊!
相关推荐阅读
用户124183 2010-10-04 18:48
[Craftor原创]基于Verilog的I2C总线驱动设计
摘要:此版本的设计中,笔者将协议里对总线的操作细分为4个,即起始(Start)、写(Write)、读(Read)、停止(Stop),并给对应的操作编码:起始(1000)、写(0100)、读(0010)...
用户124183 2010-09-03 10:42
4/8/16/32/64位乘法器的设计
4/8/16/32/64位乘法器的设计,单个时钟周期运算出结果。思路如下:4位乘法器a,b输入,y输出。使用case语句,对于输入a,y输出是b输入的16种可能。单个周期内可以输出结果。8位乘法器a,...
用户124183 2010-09-02 15:32
除法器的设计与仿真(Verilog&VHDL)
最近在做算法,要用到除法。本来想使用除法器的IP核,但发现Xilinx的除法器IP核是流水线的,如果是批量的数做除法,自然是很快,也很方便。而我的算法中需要将前一次的结果算出来之后,再到下一次运算里做...
用户124183 2010-08-06 09:58
Modelsim中添加Xilinx仿真库
不少朋友在刚接触Xilinx的FPGA时,对仿真库的编译和使用不是很了解,而官方的说明也不是很详细,而且看起来有些费劲,这里Craftor给出在Modelsim中编译和使用Xilinx库的详细教程,P...
用户124183 2010-08-02 22:51
周末写了个51单片机软核
为了弥补这段时间的罪过,这个周末决定做宅男,写程序。其实酝酿51软核已经有好几个月时间了,之前是因为在一个地方卡住了,中间停止了。上周五上班的时候突然来了灵感,一下子想通了,呵呵代码不长,1000多行...
用户124183 2010-06-19 15:41
深入研究Modelsim之使用do文件仿真(1)
Modelsim的仿真功能非常强大,本文介绍使用do脚本仿真单个Verilog或者VHDL文件的操作过程,希望对大家有用!以带时钟和复位信号的计数器为例,代码如下:module counter (  ...
我要评论
3
8
关闭 站长推荐上一条 /2 下一条