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 ...
随机推荐
- 本地不安装oracle,PLsql远程连接
Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...
- 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)
上一节课,我给大家分享了微信API接入以及事件推送的回复,这是微信开发的第二节课,重点给说一说单图文回复,多图文回复,access_token,微信SDK. 公众号消息回复很多种形式,常见的形式有,文 ...
- js网页判断移动终端浏览器版本信息是安卓还是苹果ios,判断在微信浏览器跳转不同页面,生成二维码
一个二维码,扫描进入网页,自动识别下载苹果和安卓客户端,判断网页如下,(只有苹果的微信不能自动跳转)所以加个微信判断. <!DOCTYPE html> <html> <h ...
- Notepad++中实现Markdown语法高亮与实时预览
Notepad ++是一个十分强大的编辑器,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码.Notepad ++不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的 ...
- SSDB安装配置 ERROR! autoconf required! install autoconf first
SSDB简介 SSDB是一个C/C++语言开发的高性能开源NoSQL数据库服务器,支持Key-value, Keyhashmap, Key-zset(sorted set) 等数据结构,十分适合存储数 ...
- 宝塔Linux面板命令大全
安装宝塔 Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/inst ...
- JavaWeb学习笔记八 监听器
监听器Listener jservlet规范包括三个技术点:servlet :listener :filter:监听器就是监听某个对象的的状态变化的组件.监听器的相关概念事件源: 被监听的对象(三个域 ...
- Maven学习笔记一
maven是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的. Maven好处 1.普通的传统项目,包含jar包,占用空间很大.而Maven项目不包含jar包,所以占用空 ...
- 庖丁解牛Linux内核学习笔记(1)--计算机是如何工作的
存储程序计算机模型 冯诺依曼体系结构 冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有cpu和内存,两者通过总线连接,在cpu内部有一个寄存器叫ip(instruction ...
- 按指定id顺序查询
SELECT a.p,* FROM tb1 t,( as p union as p union as p union as p union as p ) a where t.id=a.id order ...