OpenGL ES雾
来源:互联网 发布:vb declare function 编辑:程序博客网 时间:2024/05/01 20:10
其实一般来讲,在OpenGL中所实现的雾效果和现实中的雾是有区别的。现实中的雾是充斥在空间中的,而OpenGL中的雾是附着在物体表面的,通过混合每个片元的颜色和一个常量的雾颜色来实现的,雾的密度量由顶点到相机的距离确定,离观察者近雾浓度小,而越远浓度越大。我们可以用线性关系或者非线性关系来来表达在顶点到相机之间的雾量。
首先来看两个函数:
smoothstep(float start, float end, float parameter)linstep(float start, float end, float parameter)此两个函数使用方法基本相同,如果参数小于起点,linstep 将返回0,如果参数大于终点,linstep将返回1。
smoothstep是非线性关系,linstep是线性关系,他俩的变化关系如下图。
下面是一个使用非线性关系实现的获取雾因子的顶点渲染代码:
float fogDistance = length(uCamera-(uMMatrix*vec4(aPosition,1)).xyz);//顶点到摄像机的距离 const float end = 650.0;//雾结束位置 const float start = 350.0;//雾开始位置 vFogFactor= 1.0-smoothstep(start,end,fogDistance);//计算雾因子下面是使用上面求出来的雾因子计算有雾效果的顶点颜色的片元渲染代码
vec4 objectColor=vec4(0.95,0.95,0.95,1.0);//物体颜色vec4 fogColor = vec4(0.1,0.1,0.80,1.0);//雾的颜色 if(vFogFactor != 0.0){//如果雾因子为0,不必计算光照objectColor = objectColor*ambient+objectColor*specular+objectColor*diffuse;//计算光照之后物体颜色gl_FragColor = objectColor*vFogFactor + fogColor*(1.0-vFogFactor);//物体颜色和雾颜色插值计算最终颜色}else{ gl_FragColor=fogColor; }
效果如下:
0 0
- OpenGL ES 雾
- OpenGL ES雾
- OPENGL ES
- OpenGL ES
- OpenGL ES
- opengl es
- OpenGL ES
- OpenGL ES
- opengl es
- OpenGL ES
- OpenGL ES
- OpenGL ES
- opengl ES
- openGL ES
- opengl es
- OpenGL ES
- OpenGL ES
- OpenGL ES
- 菜鸟学Java----Java面向对象
- 关于RECT结构体
- 百度地图搜索周边配套设施
- 【Symfony】 Doctrine Entity 常用类型以及属性
- DSP里动态内存分配malloc函数的使用
- OpenGL ES雾
- 用instancetype代替id作返回类型有什么好处
- 浏览器兼容处理
- iOS 学习日志:infoplist常用设置
- Gorgeous Sequence
- Ubuntu远程连接报错:xrdp_mm_process_login_response: login failed
- 一个bug断断续续纠结了半个月终于解决问题了~泪奔
- 移动互联网服务端相关问题
- 第四节 控制LED