图片纹理设置代码 picture=glGenLists(1);
glNewList(picture,GL_COMPILE);
glBindTexture(GL_TEXTURE_2D,texture);
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0x0);
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.4f,0.0f,0.0f);
glTexCoord2f(1.0f, 0.0f);glVertex3f(0.4f,0.0f,0.0f);
glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4f,0.8f,0.0f);
glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.4f,0.8f,0.0f);
glEnd();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
glEndList();
光照属性设置
          GLfloat light_position1[] = { 0.0, 10.0,  10.0, 1.0 };
          GLfloat light_position2[] = {-10.0, 10.0,-10.0, 1.0 };
 GLfloat light_position3[] = { 10.0, 10.0,-10.0, 1.0 };
         glLightfv(GL_LIGHT0, GL_POSITION, light_position1);
glLightfv(GL_LIGHT1, GL_POSITION, light_position2);
glLightfv(GL_LIGHT2, GL_POSITION, light_position3);
glShadeModel(GL_SMOOTH);

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
为什么当图片在旋转的时候有一面是黑的看不见呢···我想要它无论在哪个角度都能够看得见怎么办???

解决方案 »

  1.   

    要加材质属性,glMaterialfv(GL_FRONT_AND_BACK,....)这样两面就能实现光照了,另外如果两面都没有光照 的话,一是可能你光源的位置不对,还有可能是你法向量设的不对。
      

  2.   

    那法向量怎么设置呢~~是不是
    glNormal3f(0.0, 0.0, -1.0);
    glNormal3f(0.0, 0.0,  1.0);
    glBegin(GL_POLYGON); 
    glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.4f,0.0f,0.0f); 
    glTexCoord2f(1.0f, 0.0f);glVertex3f(0.4f,0.0f,0.0f); 
    glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4f,0.8f,0.0f); 
    glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.4f,0.8f,0.0f); 
    glEnd(); 
    加入两个法向量,但是好像不起作用
      

  3.   

    我弄出来了··按五楼说的改成这样就行
    GLfloat mat[]={0.5,0.5,0.5,1};
    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat);
    glBegin(GL_POLYGON); 
    glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.4f,0.0f,0.0f); 
    glTexCoord2f(1.0f, 0.0f);glVertex3f(0.4f,0.0f,0.0f); 
    glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4f,0.8f,0.0f); 
    glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.4f,0.8f,0.0f); 
    glEnd(); 但是出现一个问题,我原有两张纹理贴图,一张是显示只有一面的图片,另一个是一个球状物体,现在按各位的说法我解决了图片的问题,但是按这样设置球状物体的纹理又显得太亮了,现在能不能这样,运用材料发射的东西glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat);作用于不同的纹理贴图上,在图片上把DIFFUSE和AMBIENT设置的高一些,而球状的那个就设置的低一些,请问这样怎么实现???
      

  4.   


    有两种方法可以实现:
    1,使用
    gglPushMatrix();
    设置材质属性...
    画一些图形(如你的贴图)
    glPopMatrix();然后gglPushMatrix();
    设置材质属性...
    画另一些图形(如你的球体)
    glPopMatrix();2,使用glColorMaterial(GLenum face,GLenum mode);注意:这个函数说明了两个独立的值,第一个参数说明哪一个面和哪些面被修改,而第二个参数说明这些面的哪一个或哪些材质成分要被修改。OpenGL并不为每一种face保持独立的mode变量。在调用glColorMterial()以后,首先需要用GL_COLOR_MATERIAL作为参数调用glEnable()来启动颜色材质,然后在绘图时调用glColor*()来改变当前颜色,或用glMaterial()来改变材质成分。当不用这种方式来改变材质时,可调用glDisable(GL_COLOR_MATERIAL)来关闭取消
    方法如下:
    glColorMaterial(GL_FRONT,GL_DIFFUSE);
      glEnable(GL_COLOR_MATERIAL);
      glColor3f(0.3,0.5,0.7);
      /* draw some objects here. */
      glcolor3f(0.0,1.0,0.0);
      /* draw other objects here.*/
      glDisable(GL_COLOR_MATERIAL);