|
|
我用gluNurbsSurface画了一个地形,然后想在地面上进行贴图,但是编译时不报错,连接时报错,我用的是c++,不知道为什么,请那位大虾帮忙看一下。源代码如下。我用的教材是opengl超级宝典,gltLoadTGA为导入.tga图的函数,没问题。贴图之前,运行都没问题。
#include <GL/glut.h>
#include <stdlib.h>
#include <time.h>
#include "Common/OpenGLSB.h"
#include "Common/gltools.h"
GLuint toTextures;
GLUnurbsObj *pNurb;
//旋转量
float r1 = 0.0f,r2=0.0f;
GLint nNumPoints = 10;
float ctrlPoints[10][10][3];
float Knots[20] = {0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f};
void makectrlPoints()
{
int i,j;
srand((unsigned int)time(NULL));
for (i=0; i<10; i++)
for (j=0; j<10; j++)
{
ctrlPoints[j][0]=i*5-30;
ctrlPoints[j][1]=j*4-30;
ctrlPoints[j][2]=(rand()%10);
}
}
void DrawPoints(void)
{
int i,j;
glPointSize(5.0f);
glColor3ub(220,0,0);
glBegin(GL_POINTS);
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++)
glVertex3fv(ctrlPoints[j]);
glEnd();
}
void RenderScene(void)
{
glColor3ub(0,220,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
//
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glDepthMask(GL_TRUE);
glPushMatrix();
glTranslatef(0.0,10.0,2.0);
glRotatef(90.0f, 1.0f,0.0f,0.0f);
//控制旋转
glRotatef(r1, 0.0f,0.0f,1.0f);
glRotatef(r2, 1.0f,0.0f,0.0f);
gluBeginSurface(pNurb);
gluNurbsSurface(pNurb,
20, Knots,
20, Knots,
10 * 3,
3,
&ctrlPoints[0][0][0],
10, 10,
GL_MAP2_VERTEX_3);
gluEndSurface(pNurb);
//DrawPoints();
glPopMatrix();
glutSwapBuffers();
}
void init()
{
makectrlPoints();
GLbyte *pBytes; //
GLint iComponents, iWidth, iHeight; //
GLenum eFormat; //
glClearColor(1.0, 1.0, 1.0, 1.0 );
////////////////////光照
float ambient[] = {0.7, 0.7, 0.7, 1.0 };
float specular[] = { 1.0, 1.0, 1.0, 1.0};
//float lightPos[] = { 0.0f, 100.0f, 500.0f, 1.0f };
glEnable(GL_LIGHTING);
//glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMateriali(GL_FRONT, GL_SHININESS, 128);
glEnable(GL_AUTO_NORMAL);
////////////////////////////////////
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, -5.0, -100.0);
pNurb = gluNewNurbsRenderer();
gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE, 25.0f);
gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, (float)GLU_FILL);
// Load the main texture
glBindTexture(GL_TEXTURE_2D, toTextures);
pBytes = gltLoadTGA("stripes.tga", &iWidth, &iHeight, &iComponents, &eFormat);
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, (void *)pBytes);
free(pBytes);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glEnable(GL_TEXTURE_2D);
///////////////////////////////////////////
// Turn on texture coordiante generation
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
// Sphere Map will be the default
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
}
void rotation(int key,int x,int y)
{
if(key==GLUT_KEY_LEFT) r1=(r1+5);
if(key==GLUT_KEY_RIGHT) r1=(r1-5);
if(key==GLUT_KEY_UP) r2=(r2+5);
if(key==GLUT_KEY_DOWN) r2=(r2-5);
glutPostRedisplay();
}
void reshape(int w, int h)
{
if(h == 0)
h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (60.0f, (GLdouble)w/(GLdouble)h, 10.0, -20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0f, -15.0f, -50.0f);
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutCreateWindow("New Ground");
glutReshapeFunc(reshape);
glutSpecialFunc(rotation);
glutDisplayFunc(RenderScene);
init();
glutMainLoop();
return 0;
}
[em10] [em10] |
|