颜色干扰的问题解决了

简介:
 昨天被纹理贴图的颜色干扰问题弄的很是郁闷,自己也知道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.0f, 1.0f, 0.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.0f, 1.0f, 0.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.0f, -1.0f);            // 三角形的右下顶点 (右侧面)
            glColor3f(1.0f,0.0f,0.0f);            // 红色
        glVertex3f( 0.0f, 1.0f, 0.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.0f, 1.0f, 0.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.0f, 1.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.0f, 0.0f, 1.0f);                    // 法线指向观察者
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);

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

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

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

    glFlush();

    return TRUE;                                        // Everything Went OK
}
最终效果如图所示:


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/08/10/850602.html,如需转载请自行联系原作者

目录
相关文章
|
存储 缓存 算法
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
383 0
|
XML 前端开发 JavaScript
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
258 0
|
10月前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
537 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
数据采集 数据安全/隐私保护 开发者
|
Prometheus 监控 Cloud Native
JVM工作原理与实战(三十三):监控GC过程的工具
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了jstat工具、VisualVM插件、Prometheus + Grafana、GC日志等内容。
469 0
|
11月前
|
缓存
在 setup 函数中使用 computed 计算属性
【10月更文挑战第23天】在 Vue3 中,`computed` 计算属性为我们提供了一种方便且高效的方式来处理基于其他响应式数据的派生数据。在 `setup` 函数中使用 `computed` 计算属性,可以让我们更好地组织和管理组件的逻辑。
|
Linux
【Linux 或Mac系统】自动生成项目结构目录并放在README.md文件中
如何在Linux或Mac系统中使用tree命令自动生成项目结构目录,并将其格式化后放入项目的README.md文件中以展示项目结构。
373 1
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之视觉信息在说话人日志技术中的问题如何解决
3D-Speaker说话人任务的开源项目问题之视觉信息在说话人日志技术中的问题如何解决
145 0
|
消息中间件 存储 Kafka
Flink 实时数仓(二)【ODS 层开发】
Flink 实时数仓(二)【ODS 层开发】