|
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>
#define WIDTH 400
#define HEIGHT 400
#define ColoredVertex(c,v) do{glVertex3fv(v);glColor3fv(c);}while(0)
static GLfloat angle=0.0f;
void myDisplay()
{
GLfloat
PointA[]={0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointB[]={-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointC[]={0.0f,-sqrt(6.0f)/12,sqrt(3.0f)/3},
PointD[]={0.0f,sqrt(6.0f)/4,0};
GLfloat
ColorR[]={1,0,0},
ColorG[]={0,1,0},
ColorB[]={0,0,1},
ColorY[]={1,1,0};
GLfloat light_position[]={0.0f,0.0f,0.0f,1.0f};
GLfloat light_ambient[]={0.0f,0.0f,0.0f,1.0f};
GLfloat light_diffuse[]={1.0f,1.0f,1.0f,1.0f};
GLfloat light_specular[]={1.0f,1.0f,1.0f,1.0f};
GLfloat a_mat_ambient[] = {0.5f, 0.0f, 0.0f, 1.0f};
GLfloat a_mat_diffuse[] = {0.5f, 0.0f, 0.0f, 1.0f};
GLfloat a_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f};
GLfloat a_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat a_mat_shininess = 30.0f;
GLfloat b_mat_ambient[] = {0.0f, 0.5f, 0.0f, 1.0f};
GLfloat b_mat_diffuse[] = {0.0f, 0.5f, 0.0f, 1.0f};
GLfloat b_mat_specular[] = {0.0f, 1.0f, 0.0f, 1.0f};
GLfloat b_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat b_mat_shininess = 30.0f;
GLfloat c_mat_ambient[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat c_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};
GLfloat c_mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat c_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat c_mat_shininess = 30.0f;
GLfloat d_mat_ambient[] = {0.5f, 0.5f, 0.0f, 1.0f};
GLfloat d_mat_diffuse[] = {0.5f, 0.5f, 0.0f, 1.0f};
GLfloat d_mat_specular[] = {1.0f, 1.0f, 0.0f, 1.0f};
GLfloat d_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat d_mat_shininess = 30.0f;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glRotatef(angle,1,0.5,0);
glBegin(GL_TRIANGLES);
//ABC
glMaterialfv(GL_FRONT, GL_AMBIENT, a_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, a_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, a_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, a_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, a_mat_shininess);
glVertex3fv(PointA);
glMaterialfv(GL_FRONT, GL_AMBIENT, b_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, b_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, b_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, b_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, b_mat_shininess);
glVertex3fv(PointB);
glMaterialfv(GL_FRONT, GL_AMBIENT, c_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, c_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, c_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, c_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, c_mat_shininess);
glVertex3fv(PointC);
//ACD
glMaterialfv(GL_FRONT, GL_AMBIENT, a_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, a_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, a_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, a_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, a_mat_shininess);
glVertex3fv(PointA);
glMaterialfv(GL_FRONT, GL_AMBIENT, c_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, c_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, c_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, c_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, c_mat_shininess);
glVertex3fv(PointC);
glMaterialfv(GL_FRONT, GL_AMBIENT, d_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, d_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, d_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, d_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, d_mat_shininess);
glVertex3fv(PointD);
//CBD
glMaterialfv(GL_FRONT, GL_AMBIENT, c_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, c_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, c_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, c_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, c_mat_shininess);
glVertex3fv(PointC);
glMaterialfv(GL_FRONT, GL_AMBIENT, b_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, b_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, b_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, b_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, b_mat_shininess);
glVertex3fv(PointB);
glMaterialfv(GL_FRONT, GL_AMBIENT, d_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, d_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, d_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, d_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, d_mat_shininess);
glVertex3fv(PointD);
//BAD
glMaterialfv(GL_FRONT, GL_AMBIENT, b_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, b_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, b_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, b_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, b_mat_shininess);
glVertex3fv(PointB);
glMaterialfv(GL_FRONT, GL_AMBIENT, a_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, a_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, a_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, a_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, a_mat_shininess);
glVertex3fv(PointA);
glMaterialfv(GL_FRONT, GL_AMBIENT, d_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, d_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, d_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, d_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, d_mat_shininess);
glVertex3fv(PointD);
glutSwapBuffers();
Sleep(16);
}
void myIdle(void)
{
angle+=1.0f;
if(angle>=360.0f)
{
angle=0.0f;
}
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400,400);
glutCreateWindow("OpenGL学习");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}
这个本来是个示例显示列表的程序,效果是一个旋转的四面体,我想增加光照效果,但是不知道法线的计算怎么往显示列表里加,于是就把显示列表里的东西都拿出来了,结果改成这样以后四面体不转了。新手求指导…… |
|