C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – OpenGL照明问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当我在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_@R_262_2770@;
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)screenWidth/(GLfloat)screenHeight,0.1f,1000.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

camera.@R_801_9531@eCameraPosition(mouse_x,mouse_y,screenWidth,screenHeight);


sea.buildSeaPlane();
scene.buildEdges();


glPushMatrix(); 
glColor3f(0,0);
glTranslatef(0,20,200);
model.speedDisplayFaceNormals();

glPopMatrix();

glPushMatrix();

plane.@R_801_9531@ePlanePosition();

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.使其完全不透明.

大佬总结

以上是大佬教程为你收集整理的c – OpenGL照明问题全部内容,希望文章能够帮你解决c – OpenGL照明问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。