2)令Glint subMenu = glutCreateMenu (colorSubMenu)。
2)函数glutAddSubMenu ( char *name, int menu )放在函数glutAddMenuEntry
(\后面,此时menu参数用subMenu替代。 源码如下:
#include
GLsizei winWidth = 400, winHeight = 400; // Initial Display-window size.
GLfloat red = 1.0, green = 1.0, blue = 1.0; // Initial triangle color: white. GLenum fillMode = GL_SMOOTH; // Initial polygon fill: color interpolation.
void init (void) {
glClearColor (0.6, 0.6, 0.6, 1.0); // Set display-window color to gray.
glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 300.0, 0.0, 300.0); }
void fillOption (GLint selectedOption) {
switch (selectedOption) {
case 1: fillMode = GL_FLAT; break; // Flat surface rendering. case 2: fillMode = GL_SMOOTH; break; // Gouraud rendering. }
glutPostRedisplay ( ); }
void displayTriangle (void) {
glClear (GL_COLOR_BUFFER_BIT);
glShadeModel (fillMode); // Set fill method for triangle. glColor3f (red, green, blue); // Set color for first two vertices.
glBegin (GL_TRIANGLES); glVertex2i (280, 20); glVertex2i (160, 280);
glColor3f (red, 0.0, 0.0); // Set color of last vertex to red. glVertex2i (20, 100); glEnd ( );
glFlush ( ); }
35
void reshapeFcn (GLint newWidth, GLint newHeight) {
glViewport (0, 0, newWidth, newHeight);
glMatrixMode (GL_PROJECTION); glLoadIdentity ( );
gluOrtho2D (0.0, (GLfloat) newWidth, 0.0, (GLfloat )newHeight);
displayTriangle ( ); glFlush ( ); }
void main (int argc, char **argv) {
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (200, 200); glutInitWindowSize (winWidth, winHeight); glutCreateWindow (\
init ( );
glutDisplayFunc (displayTriangle);
glutCreateMenu (fillOption); // Create pop-up menu. glutAddMenuEntry (\
glutAddMenuEntry (\
/* Select a menu option using the right mouse button. */ glutAttachMenu (GLUT_RIGHT_BUTTON);
glutReshapeFunc (reshapeFcn);
glutMainLoop ( ); }
36
实验九 真实感图形的绘制
一、实验学时 2学时 二、实验类型 设计型实验 三、实验目的和要求
了解OpenGL的光照模型,掌握消除隐藏面的基本方法;学会创建光源,选择光照模型。 四、实验内容 编写一个显示一个球面的程序,并能过交互交它们阴影化。可使用滑动条或固定选择项的菜单,调整或选择光照和材质参数。
37