opengl雾开启

#include <GL/glut.h>
#include <stdio.h>
#include <iostream>
using namespace std;
static GLint fogMode;

static void init(void){
    GLfloat position [] ={0.5,0.5,3.0,0.0};
    glEnable(GL_DEPTH_TEST);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    {
        GLfloat mat [3] ={0.1745,0.01175,0.01175};
        glMaterialfv(GL_FRONT,GL_AMBIENT,mat);
        mat[0]=0.61424;mat[1]=0.04136;mat[2]=0.04136;
        glMaterialfv(GL_FRONT,GL_DIFFUSE,mat);
        mat[0]=0.727811;mat[1]=0.626959;mat[2]=0.626959;
        glMaterialfv(GL_FRONT,GL_SPECULAR,mat);
        glMaterialf(GL_FRONT,GL_SHININESS,0.6*128.0);
    }

    glEnable(GL_FOG);
    {
        GLfloat fogColor[4]={0.0,0.8,0.0,1.0};

        fogMode=GL_EXP;
        glFogi(GL_FOG_MODE,fogMode);
        glFogfv(GL_FOG_COLOR,fogColor);
        glFogf(GL_FOG_DENSITY,0.35);
        glHint(GL_FOG_HINT,GL_DONT_CARE);
        glFogf(GL_FOG_START,1.0);
        glFogf(GL_FOG_END,5.0);
    }

    glClearColor(0.0,0.8,0.0,1.0);
}

static void renderSphere(GLfloat x,GLfloat y,GLfloat z){
    glPushMatrix();
    glTranslatef(x,y,z);
    glutSolidSphere(0.4,16,16);
    glPopMatrix();
}

void display(void){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    renderSphere(-2.,-0.5,-1.0);
    renderSphere(-1.,-0.5,-2.);
    renderSphere(0.,-0.5,-3.);
    renderSphere(1.,-0.5,-4.);
    renderSphere(2.,-0.5,-5.);
    glFlush();
}

void reshape(int w,int h){
    glViewport(0,0,(GLfloat)w,(GLfloat)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h){
      glOrtho(-2.5,2.5,-2.5*(GLfloat)h/(GLfloat)w,2.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
    }else{
        glOrtho(-2.5*(GLfloat)w/(GLfloat)h,2.5*(GLfloat)w/(GLfloat)h,-2.5,2.5,-10.0,10.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void keyboard(unsigned char key,int x,int y){
    switch(key){
    case ‘f‘:
    case ‘F‘:
        if(fogMode == GL_EXP){
            fogMode = GL_EXP2;
            printf("current fog mode is : GL_EXP2");
            cout<<"current fog mode is : GL_EXP2"<<endl;
        }else if(fogMode ==GL_EXP2){
            fogMode = GL_LINEAR;
            printf("current fog mode is : GL_LINEAR");
            cout<<"current fog mode is : GL_LINEAR"<<endl;
        }else if(fogMode ==GL_LINEAR){
            printf("current fog mode is : GL_EXP");
            cout<<"current fog mode is : GL_EXP"<<endl;
            fogMode = GL_EXP;
        }
        glFogi(GL_FOG_MODE,fogMode);
        glutPostRedisplay();
        break;
    case 27:
        exit(0);
        break;
    default:
        break;
    }
}

int main(int argc,char **argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH|GLUT_MULTISAMPLE);
    glutInitWindowSize(500,500);
    glutCreateWindow(argv[0]);

    init();
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
时间: 2024-11-10 11:07:05

opengl雾开启的相关文章

使用着色器模拟雾效果

上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法. 雾在大自然中是一种常见的天气现象,比如清晨时分在山上就能看到这种效果.我们可以使用OpenGL轻松地模拟出来,使用固定管线设置GL_FOG_COLOR,GL_FOG_DENSITY,GL_FOG_START,GL_FOG_END,GL_FOG_MODE等GL_FOG系列参数,然后调用glEnable(GL_FOG)最后渲染场景即能看到这种效果了.事实上这种固定管线的实现只是向API传递一些参数而已,而且

OpenGL法向量变换

OpenGL光照开启时,法向量用于决定特定顶点或面上接受到光照的多少.光照处理过程作用于观察坐标空间,因此,模型对象坐标系的法向量也需要使用GL_MODELVIEW矩阵变换到观察坐标系. 然而,法向量与顶点的变换方式不同.我们不能够简单将GL_MODELVIEW矩阵与法线相乘.设想顶点(0,0,0)的法向量(1,0,0).如果GL_MODELVIEW矩阵为沿Y轴移动2个单位,顶点坐标将为(0,2,0).不过,法线依旧为相同的(1,0,0),而不是(1,2,0). 为了理解法向量如何变换到观察空间

关于Unity中水和雾的使用

水 自己来做水和雾还是有点麻烦的,不过没关系,Unity帮我们做好了很多可以用的. 1.Unity自己实现了水的特效,帮助我们解决游戏中水的问题 2.Unity的水集成在了Environment的环境资源包里面,导入的方法是:Assert---->Import---->Environent导入 需要正式版才能看到这个菜单,没有的话也没关系,我们可以使用网上别人导出的package 3.水分为Water与Water(Basic)两个文件夹,Basic效果要差,但是占用CPU比较低.两个文件夹中都

[OpenGL] 基于纹理绘制的透明精灵

在二维游戏中,我们几乎绕不开精灵绘制这一过程,除了直接在opengl读入图像并绘制外,我们更常使用纹理来完成这一过程,把纹理贴到在xy平面上的面片,做出二维游戏的效果. 这样我们可以很方便的使用opengl提供给我们的一些方法来执行精灵的变换,而不是使用大量的贴图来手工完成变换过程:同时,还可以通过调节深度信息来确定物体的遮挡关系,而不用花心思考虑绘制的先后顺序,因为我们知道,在二维世界里,谁遮挡谁是和绘制顺序相关的. 但是,我们也发现,我们的精灵不总是四四方方的,所以纹理加载进来后会有背景色,

OpenGL学习脚印: 视变换(view transformation)

写在前面 OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习.上一节模型变换,本节学习模型变换的下一阶段--视变换.到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了.本节示例程序均可在我的github下载. 通过本节可以了解到 视变换的概念 索引绘制立方体 LookAt矩阵的推导(对数学不感兴趣,可以跳过) 相机位置随时间改变的应用程序 坐标处理的全局过程(了解,另文详述) Ope

OpenGL超级宝典笔记——深度纹理和阴影 【转】

目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面).在OpenGL1.4引入了一种新的方法阴影贴图来产生阴影. 阴影贴图背后的原理是简单的.我们先把光源的位置当作照相机的位置,我们从这个位置观察物体,我们就知道哪些物体的表面是被照射到(被光源看到) 的,哪些是没有被照射到(被遮挡住)的(在某个方向上离光源最近的表面是被照射的,后面的表面则没有被照射到

C#应用视频教程2.2 OPENGL虚拟仿真介绍

三维在理解了如何绘制2D元素之后,我们尝试绘制3D元素. 其实多个三角形也能够成四面体,多个长方形也能够成六面体,所以绘制3D元素的时候,只要顶点数量匹配就行了 ? 这里我们尤其注意,我把绘制之前的三个平移和三个旋转单独拿出来做成变量,如果你的TranslateZ默认值是0的话,你默认看到的是黄色面,如果把TranslateZ设置为负值,则看到了红色,且越来越小,如果把TranslateZ设置为正数,则啥也看不到了.这里读者还需要有一个额外的空间想象能力,就是你的观察视角在哪里.默认的时候你的观

16、事例十六:多重纹理映射

//自动生成出现问题,推荐采用传统新建winform形式 namespace sharpGLTest16_1 { public partial class Form1 : Form { static float wrap = 0; // 用于雾的流动 SharpGL.SceneGraph.Assets.Texture[] textureAry = new SharpGL.SceneGraph.Assets.Texture[4]; float[] fLightPosition = new floa

源代码-大型3D网游《轮回》的安卓测试评估app

下载地址: http://user.qzone.qq.com/188500397/blog/1441567649 其中技术: 多重贴图 opengl 雾 高度图 地面贴图 模型 纹理贴图 水面 显卡编程 顶点着色器 花草树木 当前地面高度计算 Android Studio入门框架 等应有尽有,是大型3d手游的必备技术 领到此份源代码的同学,等于即刻会安卓3d游戏编程,含资源的哦. 欢迎转发,知道的人多了我还会继续开放更新版本的源代码,有问题找我. 联系人姓名: 黄进鲁 电子邮件: [email