|
能编译通过, 但是 #ifdef GLU_VERSION_1_3, 发现没有定义#define GLU_VERSION_1_3, 请问该怎么办? 请注意我已包含了#include <GL/glew.h>,而且第12章之前的例子都是ok的,下面是源代码! 请大家帮忙!!先谢谢了 [em4] [em17] [em17] [em6] [em7]
#include <windows.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef GLU_VERSION_1_3
#ifndef CALLBACK
#define CALLBACK
#endif
GLfloat ctlpoints[4][4][3];
int showPoints = 0;
GLUnurbsObj *theNurb;
/*
* Initializes the control points of the surface to a small hill.
* The control points range from -3 to +3 in x, y, and z
*/
void init_surface(void)
{
int u, v;
for (u = 0; u < 4; u++) {
for (v = 0; v < 4; v++) {
ctlpoints[v][0] = 2.0*((GLfloat)u - 1.5);
ctlpoints[v][1] = 2.0*((GLfloat)v - 1.5);
if ( (u == 1 || u == 2) && (v == 1 || v == 2))
ctlpoints[v][2] = 3.0;
else
ctlpoints[v][2] = -3.0;
}
}
}
void CALLBACK nurbsError(GLenum errorCode)
{
const GLubyte *estring;
estring = gluErrorString(errorCode);
fprintf (stderr, "Nurbs Error: %s\n", estring);
exit (0);
}
void CALLBACK beginCallback(GLenum whichType)
{
glBegin (whichType); /* resubmit rendering directive */
printf ("glBegin(");
switch (whichType) { /* print diagnostic message */
case GL_LINES:
printf ("GL_LINES)\n");
break;
case GL_LINE_LOOP:
printf ("GL_LINE_LOOP)\n");
break;
case GL_LINE_STRIP:
printf ("GL_LINE_STRIP)\n");
break;
case GL_TRIANGLES:
printf ("GL_TRIANGLES)\n");
break;
case GL_TRIANGLE_STRIP:
printf ("GL_TRIANGLE_STRIP)\n");
break;
case GL_TRIANGLE_FAN:
printf ("GL_TRIANGLE_FAN)\n");
break;
case GL_QUADS:
printf ("GL_QUADS)\n");
break;
case GL_QUAD_STRIP:
printf ("GL_QUAD_STRIP)\n");
break;
case GL_POLYGON:
printf ("GL_POLYGON)\n");
break;
default:
break;
}
}
void CALLBACK endCallback()
{
glEnd(); /* resubmit rendering directive */
printf ("glEnd()\n");
}
void CALLBACK vertexCallback(GLfloat *vertex)
{
glVertex3fv(vertex); /* resubmit rendering directive */
printf ("glVertex3f (%5.3f, %5.3f, %5.3f)\n",
vertex[0], vertex[1], vertex[2]);
}
void CALLBACK normalCallback(GLfloat *normal)
{
glNormal3fv(normal); /* resubmit rendering directive */
printf ("glNormal3f (%5.3f, %5.3f, %5.3f)\n",
normal[0], normal[1], normal[2]);
}
/* Initialize material property and depth buffer.
*/
void init(void)
{
GLfloat mat_diffuse[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 100.0 };
glClearColor (0.0, 0.0, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
init_surface();
theNurb = gluNewNurbsRenderer();
gluNurbsProperty(theNurb, GLU_NURBS_MODE,
GLU_NURBS_TESSELLATOR);
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
gluNurbsCallback(theNurb, GLU_ERROR, (void(__stdcall*)())nurbsError);
gluNurbsCallback(theNurb, GLU_NURBS_BEGIN, (void(__stdcall*)())beginCallback);
gluNurbsCallback(theNurb, GLU_NURBS_VERTEX, (void(__stdcall*)())vertexCallback);
gluNurbsCallback(theNurb, GLU_NURBS_NORMAL, (void(__stdcall*)())normalCallback);
gluNurbsCallback(theNurb, GLU_NURBS_END, (void(__stdcall*)())endCallback);
}
void display(void)
{
GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(330.0, 1.,0.,0.);
glScalef (0.5, 0.5, 0.5);
gluBeginSurface(theNurb);
gluNurbsSurface(theNurb,
8, knots, 8, knots,
4 * 3, 3, &ctlpoints[0][0][0],
4, 4, GL_MAP2_VERTEX_3);
gluEndSurface(theNurb);
if (showPoints) {
glPointSize(5.0);
glDisable(GL_LIGHTING);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
glVertex3f(ctlpoints[j][0],
ctlpoints[j][1], ctlpoints[j][2]);
}
}
glEnd();
glEnable(GL_LIGHTING);
}
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (45.0, (GLdouble)w/(GLdouble)h, 3.0, 8.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'c':
case 'C':
showPoints = !showPoints;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow(argv[0]);
GLenum err = glewInit();
if (GLEW_OK != err)
{
char cInfo[256];
sprintf(cInfo, "Error: %s\n", glewGetErrorString(err));
}
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc (keyboard);
glutMainLoop();
return 0;
}
#else
int main(int argc, char** argv)
{
fprintf (stderr, "This program demonstrates a feature which is introduced in the\n");
fprintf (stderr, "OpenGL Utility Library (GLU) Version 1.3.\n");
fprintf (stderr, "If your implementation of GLU has the right extensions,\n");
fprintf (stderr, "you may be able to modify this program to make it run.\n");
return 0;
}
#endif
|
|