颜色干扰的问题解决了

    昨天被纹理贴图的颜色干扰问题弄的很是郁闷,自己也知道OpenGL是个状态机,状态设定好后就一直是有效的,但就是想不明白后面设置的状态怎么会影响到前面呢?
    在csdn上请教了高手后,终于知道问题改怎么解决了,只需要在绑定纹理前开启纹理,并且在使用完纹理后就关闭纹理,否则的话纹理就一直处于开启状态,所以会影响到不使用纹理贴图的那个物体的绘制,修改后代码如下:


int COpenGLDemoView::DrawGLScene()                                   
{
// Here's Where We Do All The Drawing
    
    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);    // Clear Screen And Depth Buffer

    glPushAttrib(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
    glPushMatrix();

    glShadeModel(GL_SMOOTH);
    glLoadIdentity();                                    
// Reset The Current Modelview Matrix
    glTranslatef(-1.5f,0.0f,-6.0f);//物体左移1.5,向内移6,相当于移动镜头一样,让物体进入镜头中
    glRotatef(rTri,0.0f,1.0f,0.0f);
    glBegin(GL_TRIANGLES);                            
// 绘制三角形
    glColor3f(1.0f,0.0f,0.0f);            // 红色
        glVertex3f( 0.0f1.0f0.0f);            // 三角形的上顶点 (前侧面)
        glColor3f(0.0f,1.0f,0.0f);            // 绿色
        glVertex3f(-1.0f,-1.0f1.0f);            // 三角形的左下顶点 (前侧面)
        glColor3f(0.0f,0.0f,1.0f);            // 蓝色
        glVertex3f( 1.0f,-1.0f1.0f);            // 三角形的右下顶点 (前侧面)
            glColor3f(1.0f,0.0f,0.0f);            // 红色
        glVertex3f( 0.0f1.0f0.0f);            // 三角形的上顶点 (右侧面)
        glColor3f(0.0f,0.0f,1.0f);            // 蓝色
        glVertex3f( 1.0f,-1.0f1.0f);            // 三角形的左下顶点 (右侧面)
        glColor3f(0.0f,1.0f,0.0f);            // 绿色
        glVertex3f( 1.0f,-1.0f-1.0f);            // 三角形的右下顶点 (右侧面)
            glColor3f(1.0f,0.0f,0.0f);            // 红色
        glVertex3f( 0.0f1.0f0.0f);            // 三角形的上顶点 (后侧面)
        glColor3f(0.0f,1.0f,0.0f);            // 绿色
        glVertex3f( 1.0f,-1.0f-1.0f);            // 三角形的左下顶点 (后侧面)
        glColor3f(0.0f,0.0f,1.0f);            // 蓝色
        glVertex3f(-1.0f,-1.0f-1.0f);            // 三角形的右下顶点 (后侧面)
glColor3f(1.0f,0.0f,0.0f);            // 红色
        glVertex3f( 0.0f1.0f0.0f);            // 三角形的上顶点 (左侧面)
        glColor3f(0.0f,0.0f,1.0f);            // 蓝色
        glVertex3f(-1.0f,-1.0f,-1.0f);            // 三角形的左下顶点 (左侧面)
        glColor3f(0.0f,1.0f,0.0f);            // 绿色
        glVertex3f(-1.0f,-1.0f1.0f);            // 三角形的右下顶点 (左侧面
    glEnd();                                // 三角形绘制结束

    glPopMatrix();
    glPopAttrib();


    glPushAttrib(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
    glPushMatrix();

    glLoadIdentity();
    glTranslatef(
1.5f,0.0f,-6.0f);

    glRotatef(xrot,
1.0f,0.0f,0.0f);
    glRotatef(yrot,
0.0f,1.0f,0.0f);
    glRotatef(zrot,
0.0f,0.0f,1.0f);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[
0]);

    glBegin(GL_QUADS);                            
//  绘制正方形

        
// Front Face
        glNormal3f( 0.0f0.0f1.0f);                    // 法线指向观察者
        glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
        glTexCoord2f(
1.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
        glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(
0.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);

        
// Back Face
        glNormal3f( 0.0f0.0f,-1.0f);                    // 法线背向观察者
        glTexCoord2f(1.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
        glTexCoord2f(
1.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
        glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
        glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);

        
// Top Face
        glNormal3f( 0.0f1.0f0.0f);                    // 法线向上
        glTexCoord2f(0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
        glTexCoord2f(
0.0f0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(
1.0f0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);

        
// Bottom Face
        glNormal3f( 0.0f,-1.0f0.0f);                    // 法线朝下
        glTexCoord2f(1.0f1.0f); glVertex3f(-1.0f-1.0f-1.0f);
        glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f-1.0f-1.0f);
        glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
        glTexCoord2f(
1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
        
// Right face
        glNormal3f( 1.0f0.0f0.0f);                    // 法线朝右
        glTexCoord2f(1.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);
        glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
        glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
        
// Left Face
        glNormal3f(-1.0f0.0f0.0f);                    // 法线朝左
        glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
        glTexCoord2f(
1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
        glTexCoord2f(
1.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(
0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
    glEnd();                                
// 正方形绘制结束
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glPopAttrib();

    glFlush();

    
return TRUE;                                        // Everything Went OK
}

最终效果如图所示:

200781001.jpg


posted on   Phinecos(洞庭散人)  阅读(1501)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示