发信人: yxy (田丝丝#冬眠的小肥鹰), 信区: GAME_Designer 
标  题: OPENGL(11) 
发信站: BBS 水木清华站 (Thu Jan 22 10:46:32 1998) 
 
这次将结束纹理的内容。紧接上次,在上次平面纹理贴图中,我们先 
定义了一个数组(一维或二维...)来定义纹理的数据,所以纹理本身 
是一个N维空间,有自己的坐标和顶点。在上次的例子中,我们学会了 
如何把纹理数据中的坐标和屏幕物体坐标相结合,就象把一块布料扯成 
合适的形状贴在物体表面。而上次唯一没有使用的函数是纹理坐标的自 
动产生(最后一个给出的函数),它的意义是产生一个环境纹理,所有 
环境内的物体都赋予此纹理,很象一个特殊光源。 
///////////////////////////////////////////////////////////// 
//sample.cpp 
#include "glos.h" 
#include <GL/gl.h> 
#include <GL/glaux.h> 
#include "windows.h" 
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
//定义一个一维纹理的数据,从生成来看,保持红色、兰色分量255(MAX), 
//所以是渐变的紫色纹理,饱和度不断变化。 
#define TEXTUREWIDTH 64 
GLubyte Texture[3*TEXTUREWIDTH]; 
void makeTexture(void) 

 int i; 
 for(i=0;i<TEXTUREWIDTH;i++) 
 { 
   Texture[3*i]=255; 
   Texture[3*i+1]=255-2*i; 
   Texture[3*i+2]=255; 
 } 

GLfloat sgenparams[]={1.0,1.0,1.0,0.0}; 
 
void myinit(void) 

        auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.0,0.0,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
 
//创建纹理 
        makeTexture(); 
        glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
//控制纹理 
        glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); 
        glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
        glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
        glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
        glTexImage1D(GL_TEXTURE_1D,0,3,TEXTUREWIDTH,0, 
                         GL_RGB,GL_UNSIGNED_BYTE,Texture); 
//唯一与前面例子不同的地方:启用纹理坐标自动产生,生成环境纹理 
//纹理的方向S 
        glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); 
        glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams); 
//启用纹理 
        glEnable(GL_TEXTURE_1D); 
        glEnable(GL_TEXTURE_GEN_S); 
 
 
//启用消隐       
       glEnable(GL_DEPTH_TEST); 
       glDepthFunc(GL_LESS); 
         
//一些绘图控制,详细可参阅VC5联机帮助 
       glEnable(GL_CULL_FACE); 
       glEnable(GL_LIGHTING); 
       glEnable(GL_LIGHT0); 
       glEnable(GL_AUTO_NORMAL); 
       glEnable(GL_NORMALIZE); 
       glFrontFace(GL_CW); 
       glCullFace(GL_BACK); 
       glMaterialf(GL_FRONT,GL_SHININESS,64.0); 
//     glShadeModel(GL_FLAT); 

 
void CALLBACK reshape(GLsizei w,GLsizei h) 

 
glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
 
if(w<=h) 
 glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w, 
         4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0); 
else 
  glOrtho(-4.0*(GLfloat)h/(GLfloat)w, 
         4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0,-4.0,4.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

 
void CALLBACK display(void) 

  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
  glPushMatrix(); 
  glRotatef(30.0,1.0,0.0,0.0); 
//功能强大的辅助库函数:呵呵画出一个大茶壶。 
  auxSolidTeapot(1.5); 
  glPopMatrix(); 
  glFlush(); 

void main(void) 

        myinit(); 
        
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 

//end of sample 
//////////////////////////////////////////////////////////// 
至此纹理的全部内容已经完毕。从运行结果来看,一个物体全部进行 
了表面的纹理映射。 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.74.90]