OpenGL平面阴影
几种绘制阴影的方法
在OpenGL中,比较常见的绘制阴影的方法有:shadow mapping,shadow volumes以及一种在红宝书上提及的适合在确定平面上绘制阴影的方法。
平面阴影
在确定的平面下,可以直接通过模版测试,经过变换矩阵来显示阴影。具体的过程如下:
- 开启模板测试,初始化模板缓冲区为0
- 模板测试设置为所有绘制都能通过,绘制地面,所有通过缓冲测试值设为1
- 禁用光照,禁用深度测试
- 修改模板测试条件,只有等于1的才能通过,通过测试则递增
- 创建阴影矩阵
- 加载阴影矩阵,绘制场景中除地面外的所有物体
- 开启光照,启用深度测试,禁用模板测试
接下来是阴影矩阵的计算方法
void create_matrix(float m[16], float point[3], float normal[3], float lp[4])
{
/** 计算顶点到平面的距离 */
float d = -((normal[0] * point[0]) + (normal[1] * point[1]) + (normal[2] * point[2]));
/** 计算光源向量和法向量的点积 */
float dot = normal[0]*lp[0] + normal[1]*lp[1] + normal[2]*lp[2] + d*lp[3];
/** 设置矩阵元素值 */
m[0] = dot - lp[0] * normal[0];
m[1] = -lp[1] * normal[0];
m[2] = -lp[2] * normal[0];
m[3] = -lp[3] * normal[0];
m[4] = -lp[0] * normal[1];
m[5] = dot - lp[1] * normal[1];
m[6] = -lp[2] * normal[1];
m[7] = -lp[3] * normal[1];
m[8] = -lp[0] * normal[2];
m[9] = -lp[1] * normal[2];
m[10] = dot - lp[2] * normal[2];
m[11] = -lp[3] * normal[2];
m[12] = -lp[0] * d;
m[13] = -lp[1] * d;
m[14] = -lp[2] * d;
m[15] = dot - lp[3] * d;
}
逐个说明函数的每个参数。
m,是一个4x4的阴影矩阵
point,是地面上的任意一个点的三维坐标
normal,是地面的法线
lp,是光源的坐标,光源的坐标是{x, y, z, w},其中w如果为0.0,代表的是方向光源,位于无限远,发出的是平行光,如果是1.0,那么代表的是位置光源
待续>>>
OpenGL平面阴影的更多相关文章
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
- 如何使用Android中的OpenGL ES媒体效果
引自:http://www.2cto.com/kf/201506/404366.html Android的媒体效果框架允许开发者可以很容易的应用多种令人印象深刻的视觉效果到照片或视频之上.作为这个媒体 ...
- 由浅入深学习PBR的原理和实现
目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...
- 使用WebGL + Three.js制作动画场景
使用WebGL + Three.js制作动画场景 3D图像,技术,打造产品,还有互联网:这些只是我爱好的一小部分. 现在,感谢WebGL的出现-一个新的JavaScriptAPI,它可以在不依赖任何插 ...
- [ZZ] D3D中的模板缓存(3)
http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的 ...
- MATLAB绘图与图形处理
参考:http://www.cnblogs.com/djcsch2001/tag/MATLAB/ matlab部分写的不错! 7.2 三维图形 7.2.1 三维曲线.面填色命令 命令1 com ...
- 基于 Android 的 3D 视频示例代码
笔者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...
- 基于 Android 的 3D 视频样本代码
作者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...
- DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制
前言 到现在为止,所有的教程项目都没有使用Effects11框架类来管理资源.因为在D3DCompile API (#47)版本中,如果你尝试编译fx_5_0的效果文件,会收到这样的警告: X4717 ...
随机推荐
- Algorithm --> 6174问题
6174问题 假设一个各位数字不相同的四位数,把所有数字从大到小排序后得到a, 从小到大排序后得到b,然后用a-b替换原来这个数,继续操作.例如,从1234出发,依次有4321-1234=3078,8 ...
- 如何在win10查看wifi密码
tep1 找到wifi图标 step 2 右键点击打开网络共享中心 没有啦!!
- [BZOJ 1297][SCOI2009]迷路
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1418 Solved: 1017[Submit][Status ...
- Python读取配置文件,并连接数据库SQL Server
用配置文件保存固定的连接数据,改的话比较方便. 1.新建一个配置文件:SQlconfig.config,以数据库为例. 内容如下,当然也可以添加多个 [Database1] database=db_t ...
- 【RabbitMQ系列】队列、绑定、交换器
队列: 从概念上来讲,AMQP消息路由必须有三部分:交换器.队列和绑定.生产者把消息发布到交换器上:消息最终到达队列,并被消费者接收:绑定决定了消息如何从路由器路由到特定的队列. 消费者通过以下两种方 ...
- C语言程序设计课程总结
第一次教授C语言程序设计课程,相比计算机组成原理.arm体系结构等偏向硬件的课程,C的教学方式要灵活一些.计算机组成原理课程偏向理论,哈尔滨工业大学的计算机组成原理是国家精品课,增加了mooc+spo ...
- 结对作业NO.2
结对NO.2 1. 引言 1.1 项目地址 github 生成的一组好数据 1.2 项目简介 按照老师给的项目要求:"编码实现一个部门与学生的智能匹配的程序".由于数据需要自己生成 ...
- 每日冲刺报告——Day4(Java-Team)
第四天报告(11.5 周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...
- Django 模版语法
一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. {% extends "base ...
- listview 与 button 焦点 在item添加下列属性
android:descendantFocusability="blocksDescendants" http://zhaojianping.blog.51cto.com/7251 ...