当我在OpenGL中启用照明时,我无法看到我创建的对象.我有一个从3D Max导入的对象,照明工作正常,但我的场景的其余部分没有.我知道我需要指定法线但这似乎没有帮助.虽然如果我在我的display()函数中创建一个正常工作的简单多边形,但是在类的方法中创建并在display()函数中调用的其他多边形没有显示出来
这是我的照明代码
glewInit(); glClearColor(0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT) glShadeModel(GL_SMOOTH); //light position and colour GLfloat light_position[] = { 0.0,20.0,0.0 }; GLfloat white_light[] = {0.8,0.8,0.0}; GLfloat diff_light[] = {1.0,1.0,0.0}; GLfloat spec_light[] = {1.0,0.0}; glLightfv(GL_LIGHT0,GL_AMBIENT,white_light); glLightfv(GL_LIGHT0,GL_DIFFUSE,diff_light); glLightfv(GL_LIGHT0,GL_SPECULAR,spec_light); glLightfv(GL_LIGHT0,GL_POSITION,light_position); //ambient light GLfloat ambient[] = {0.3,0.3,0.3}; glMaterialfv(GL_FRONT,ambient); //diffuse material component GLfloat diff[] = {0.6,0.6,0.6}; glMaterialfv(GL_FRONT,diff); //specular material component GLfloat WhiteSpec[] = {1,1,1}; glMaterialfv(GL_FRONT,WhiteSpec); GLfloat shininess = 50; glMaterialf(GL_FRONT,GL_SHININESS,shininess); //ENABLE LIGHTING AND DEPTH TEST glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);
这是我创造我的海洋的类方法
glColor3f(0,1); glPushMatrix(); //enable texturing glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D,seaTex); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); for(int i = 0,k = 0; i < (getWidth()/10); i++){ for(int j = 0; j < (getLength()/10); j++){ if(i >= Sea::waveLoc1 && i <= Sea::waveLoc1+Sea::sinArrayLength){ int nextK = k+1; if(nextK == Sea::sinArrayLength){ nextK = 0; } if(i == Sea::waveLoc1+Sea::sinArrayLength){ //front of wave glBegin(GL_POLYGON); glNormal3f(0.0f,1.0f,0.0f); glTexCoord2f(0.0,1.0);glVertex3f(Sea::seaGrid[i][j].x,Sea::sinVals[nextK],Sea::seaGrid[i][j].z); glTexCoord2f(0.0,0.0);glVertex3f(Sea::seaGrid[i][j+1].x,Sea::seaGrid[i][j+1].z); glTexCoord2f(1.0,0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x,Sea::seaGrid[i+1][j+1].y,Sea::seaGrid[i+1][j+1].z); glTexCoord2f(1.0,1.0);glVertex3f(Sea::seaGrid[i+1][j].x,Sea::seaGrid[i+1][j].y,Sea::seaGrid[i+1][j].z); glEnd(); }else{ //rest of wave glBegin(GL_POLYGON); glNormal3f(0.0f,Sea::sinVals[k],Sea::seaGrid[i+1][j].z); glEnd(); } }else{ //draw flat sea glBegin(GL_POLYGON); glNormal3f(0.0f,0.0f); glTexCoord2f(0.0,Sea::seaGrid[i+1][j].z); glTexCoord2f(0.0,Sea::seaGrid[i+1][j+1].z); glTexCoord2f(1.0,Sea::seaGrid[i][j+1].y,Sea::seaGrid[i][j+1].z); glTexCoord2f(1.0,Sea::seaGrid[i][j].y,Sea::seaGrid[i][j].z); glEnd(); } } //increment k if i is in the area of the wave if(k < Sea::sinArrayLength-1 && (i >= Sea::waveLoc1 && i <= Sea::waveLoc1+Sea::sinArrayLength)){ k++; }else if(k == Sea::sinArrayLength){ k = 0; } } if(Sea::waveLoc1 < 100 && Sea::waveInc == Sea::waveSpeedLimiter){ Sea::waveLoc1 +=1; }else if(Sea::waveLoc1 >= 100){ Sea::waveLoc1 = 0; } //limits speed of wave if(Sea::waveInc < Sea::waveSpeedLimiter){ Sea::waveInc++; }else{ Sea::waveInc = 0; } //disable texturing glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glPopMatrix();
然后在我的display()函数中调用它,如下所示
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)screenWidth/(GLfloat)screenHeight,0.1f,1000.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); camera.updateCameraPosition(mouse_x,mouse_y,screenWidth,screenHeight); sea.buildSeaPlane(); scene.buildEdges(); glPushMatrix(); glColor3f(0,0); glTranslatef(0,20,200); model.speedDisplayFaceNormals(); glPopMatrix(); glPushMatrix(); plane.updatePlanePosition(); glBegin(GL_POLYGON); glNormal3f(0.0f,0.0f); glVertex3f(0,25,10); glVertex3f(2,20); glVertex3f(0,20); glEnd(); glPopMatrix(); glFlush();
知道为什么我看不到这个吗?
更新:
如果我禁用纹理,我可以看到我的大海.如何修复它以便我可以使用纹理和灯光?
更新2:
已将纹理更改为GL_MODULATE,但我还必须删除混合才能使其正常工作.我需要启用混合吗?
解决方法
glTexEnvf(GL_TEXTURE_ENV,GL_REPLACE);
说要用纹理的结果替换照明计算.如果您希望光照影响纹理,请使用GL_MODULATE而不是GL_REPLACE.
编辑添加:
如果您希望几何体是半透明的(这通常是混合),您只需要混合.在您的情况下,代码中存在许多问题:
>你的浅色是完全透明的(所有都有0作为第4个组成部分).所以你的光让一切都看不见了.将其更改为1.>您的材料没有第4个组件.更糟糕的是,因为glMaterialfv预计有4个花车.这甚至可能导致您的应用程序崩溃或重新格式化您的磁盘.加入第四种组分,优选加入1.使其完全不透明.