`
hereson3
  • 浏览: 162991 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

OpenGL的消隐与双缓冲(2)

阅读更多

#include "stdafx.h"


#include <math.h>

#include <gl/glut.h>

#include <gl/gl.h>


bool mouseisdown=false ;

bool loopr=false ;

int mx,my;

int ry=30;

int rx=30;

 

 

void timer(int p)

{

     ry-=5;

        glutPostRedisplay();

     if (loopr)

          glutTimerFunc(200,timer,0);

 

 

}

 

 

void mouse(int button, int state, int x, int y)

{

    if (button == GLUT_LEFT_BUTTON)

     {

 

 

        if (state == GLUT_DOWN)

         {    mouseisdown=true ; loopr=false ;}

         else

              mouseisdown=false ;

     }

     if (button== GLUT_RIGHT_BUTTON)

         if (state == GLUT_DOWN)

         {loopr=true ; glutTimerFunc(200,timer,0);}

   

}

 

 

void motion(int x, int y)

{

    if (mouseisdown==true )

    {

        ry+=x-mx;

         rx+=y-my;

         mx=x;

         my=y;

         glutPostRedisplay();

    }

}

 

 

void special(int key, int x, int y)

 

 

{

    switch (key)

    {

    case GLUT_KEY_LEFT:

        ry-=5;

        glutPostRedisplay();

        break ;

    case GLUT_KEY_RIGHT:

       ry+=5;

        glutPostRedisplay();

        break ;

    case GLUT_KEY_UP:

        rx+=5;

        glutPostRedisplay();

        break ;

    case GLUT_KEY_DOWN:

        rx-=5;

      

        glutPostRedisplay();

        break ;

    }

}

 

 

 

 

void init()

    //设置OpenGL的一些状态变量的初始值

{

    glEnable(GL_DEPTH_TEST);     //深度测试

    glDepthFunc(GL_LESS);                      //设置深度测试函数

    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);        //设置多边形显示模式为正反面都是填充显示

    glClearColor(1,1,1,1);          //设置刷新背景色

    glClearDepth(1);          //设置清除深度缓冲区所用的值

}

 

 

void display()

{

       

         float red[3]={1,0,0};

         float blue[3]={0,1,0};

         float green[3]={0,0,1};

         float yellow[3]={1,1,0};   

 

 

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        

        

         glLoadIdentity();

         glRotatef(ry,0,1,0);      

         glRotatef(rx,1,0,0);

        

             

         glBegin(GL_QUADS);

              glColor3fv(green);

              glVertex3f(0.5,0.5,0);

              glVertex3f(-0.5,0.5,0);

              glVertex3f(-0.5,-0.5,0);

              glVertex3f(0.5,-0.5,0);

             

        

         glEnd();

        

         glBegin(GL_QUADS);

              glColor3fv(red);

              glVertex3f(0.5,0.5,0.3);

              glVertex3f(-0.5,0.5,-0.3);

              glVertex3f(-0.5,-0.5,-0.3);

              glVertex3f(0.5,-0.5,0.3);

             

        

         glEnd();

        

         glBegin(GL_QUADS);

             

              glColor3fv(yellow);

              glVertex3f(0.5,0.5,-0.3);

              glVertex3f(-0.5,0.5,0.3);

              glVertex3f(-0.5,-0.5,0.3);

              glVertex3f(0.5,-0.5,-0.3);

             

        

         glEnd();

 

 

        glFlush();

         glutSwapBuffers();


}

   


int main(int argc, char ** argv)

{

  

    glutInit(&argc, argv);

    glutInitDisplayMode (GLUT_DOUBLE| GLUT_RGBA|GLUT_DEPTH);         //设置显示模式:单缓冲区, RGBA颜色模式

    glutInitWindowSize (400, 400);        //设置窗口宽度、高度

    glutInitWindowPosition(100,100);         //设置窗口位置

    glutCreateWindow ("double");        //弹出窗口

     init();

    glutDisplayFunc (display);        //设置窗口刷新的回调函数

     glutMouseFunc(mouse);         //设置鼠标器按键回调函数

    glutMotionFunc(motion);

     glutSpecialFunc(special);

    glutMainLoop();        //开始主循环

    return 0;

}
分享到:
评论

相关推荐

    opengl 消隐算法

    综上所述,OpenGL中的消隐算法是构建真实感3D场景的关键技术,它结合深度缓冲和视图变换等概念,使我们可以自由地操纵3D对象并呈现清晰、无重叠的图像。通过不断学习和实践,开发者可以掌握这些技能,创造出令人惊叹...

    OpenGL.rar_OpenGL 线框_opengl 线框消隐

    总结来说,OpenGL线框消隐涉及了OpenGL的渲染模式、深度缓冲技术和可能的手动扫描线算法实现。同时,利用显示列表可以提升复杂图形的绘制效率。在实际项目中,这些技术的合理运用能帮助开发者创建出高效、清晰且具有...

    OpenGL消隐和光照

    在OpenGL观察实验的基础上,通过实现实验内容,掌握OpenGL中消隐和光照的设置,并验证课程中消隐和光照的内容。 模型尺寸不做具体要求。要求修改代码达到以下要求: 1. 通过设置材料使得桌面和四条腿的颜色各不相同...

    opengl的立方体消隐算法

    opengl的立方体消隐算法 可以实现选择 放大缩小

    openGL双缓冲用法示例

    2. 配置双缓冲:在创建OpenGL上下文时,可以使用`PIXELFORMATDESCRIPTOR`结构来指定需要双缓冲。在`PFD_DOUBLEBUFFER`标志位设置为真,表示需要双缓冲。 3. 设置窗口大小:使用`glViewport`函数来设置视口大小,这...

    OpenGL 建模及消隐实现

    比较完整的实例,实现简单模型的建模,参数修改,位置的变换,物体的拖拽,及空间环境的文件保存及打开。

    基于C++OpenGL实现的小桌茶壶图形绘制消隐和光照.zip

    在OpenGL观察实验的基础上,通过实现实验内容,掌握OpenGL中消隐和光照的设置,并验证课程中消隐和光照的内容。 模型尺寸不做具体要求。要求修改代码达到以下要求: 1.通过设置材料使得桌面和四条腿的颜色各不相同,...

    opengl实现平移缩放旋转消隐纹理

    OpenGL提供了几种不同的消隐算法,如Z-Buffer(深度缓冲)和扫描线算法,它们能够在渲染过程中自动处理这个问题,从而提供更真实的视觉效果。 项目中提到的“光照颜色变化”涉及到OpenGL的光照模型。OpenGL允许我们...

    qt+opengl实现帧缓冲

    qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl...

    利用OpenGL进行CAD三维图形消隐处理.rar_OpenGL CAD_opengl_三维 消隐_消隐

    总的来说,利用OpenGL进行CAD三维图形的消隐处理,是通过深度缓冲区和深度测试实现的,这使得在屏幕上能够正确地呈现出具有深度感的三维模型,提升视觉效果。理解并掌握这些技术对于开发高质量的CAD应用程序至关重要...

    mfc+双缓冲+opengl框架

    标题中的“mfc+双缓冲+opengl框架”揭示了我们即将探讨的是一个结合了Microsoft Foundation Classes (MFC),双缓冲技术以及OpenGL图形库的应用程序框架。MFC是微软为Windows平台开发桌面应用程序提供的一套类库,它...

    c实现正方体的旋转消隐

    2. 消隐算法:线性扫描消隐(Z-Buffering)和画家算法。 3. OpenGL:设置上下文,定义顶点,应用变换,管理深度测试。 4. 数据结构与编程技巧:用C语言表示3D坐标和颜色,处理图形数据。 5. 编程环境:使用GLUT、SDL...

    线面的消隐 MFC

    线面消隐技术主要有两种方法:Z缓冲法(也称为深度缓冲法)和扫描线算法。Z缓冲法通过在每个像素位置存储一个深度值来判断新绘制的对象是否遮挡了已存在的对象。扫描线算法则通过对屏幕每一行进行遍历,根据线和面的...

    基于 opengl的一个旋转的多面体

    7. 交换缓冲区:使用glutSwapBuffers()来呈现最终图像,实现双缓冲以避免闪烁。 此外,`PrintGL.dsp`和`PrintGL.dsw`是Visual Studio项目文件,用于管理源代码、编译设置和依赖项。 学习这个项目,你将接触到...

    消隐效果的实现(VC图像处理)

    消隐算法主要基于深度缓冲区,即每个像素对应一个Z值(深度值),表示该像素背后的3D点距离观察者的位置。当绘制新像素时,会比较新像素的Z值与缓冲区中的现有Z值,如果新像素更靠近观察者,则更新缓冲区并绘制该...

    xiaoyin.rar_消隐算法 立方体 opengl

    在这个项目中,我们关注的是软件消隐,因为描述中提到了“程序中利用了凸多面体和远近法来实现”,这表明该算法可能属于基于深度缓冲(Z-Buffer)或扫描线(Scan Line)等经典方法的一种。 凸多面体是相对简单的...

    立方体消隐

    实现一个立方体的消影演示。 要求: 可以用键盘操纵立方体的旋转(比如左键按一下向左...不可以用OpenGL直接画Cube实现消影过程。必须自行写算法实现,否则为0分。 立方体的6个面分别用不同颜色标注,方便进行区分。

    VC实现消隐技术

    常见的消隐算法有Z-Buffer(深度缓冲)法、画家算法和扫描线算法等。 1. Z-Buffer算法:这种方法基于像素级别的比较,每个像素都有一个与之关联的Z值(深度值)。在绘制新像素时,会将其Z值与当前缓冲区的Z值比较,...

    双缓冲例子

    - 在C++中,可以利用OpenGL或DirectX的双缓冲特性。 - Python的Pygame库也支持双缓冲。 - 在Unity3D等游戏引擎中,双缓冲是默认的渲染方式。 这个“双缓冲例子”可能包含了创建双缓冲环境、在后端缓冲区绘图、交换...

Global site tag (gtag.js) - Google Analytics