游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1664|回复: 0

求教!三维地图纹理贴图问题!

[复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2006-5-18 10:59:00 | 显示全部楼层 |阅读模式
我用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]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 12:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表