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 ...
随机推荐
- 后端Nodejs利用node-xlsx模块读取excel
后端Nodejs(利用node-xlsx模块) /** * Created by zh on 16-9-14. */ var xlsx = require("node-xlsx") ...
- 数据库(Mongodb)
1.MongoClient()函数 In [8]: import pymongo In [9]: con = pymongo.MongoClient('localhost') #建立连接 In [10 ...
- 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始
很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...
- OC和JS交互的三种方法
看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测.拦截Url地址实现互相调用的.剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法 ...
- python爬虫解决gbk乱码问题
今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版. 爬取过程中是老套路,先获取网页源代码 # -*- coding:UTF-8 -*- from bs4 import ...
- Eclipse项目中web app libraries和 Referenced Libraries区别
Referenced Libraries是编译环境下使用的JAR包,所谓编译环境下使用的JAR包, 就是说你在Eclipse中进行源文件的编写的时候,所需要引用到的类都从Referenced Li ...
- MyAdapter Andriod
private List<T> listdate;//定义数据对象 //为了获取item中的点击事件定义ViewHolderprivate static class ViewHolder ...
- python全栈学习--day9(函数初始)
Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...
- 个人作业Week3-案例分析
DeadLine:2017.10.13 23:00 声明:本作业以邹欣老师博客 http://www.cnblogs.com/xinz/archive/2012/03/26/2417699.html ...
- 【Alpha 阶段】后期测试及补充(第十一、十二周)
[Alpha 阶段]动态成果展示 修复了一些bug后,关于游戏的一些动态图展示如下: 终极版需求规格说明书和代码规范 经过一些细微的图片和格式的调整,完成了本学期的最终版本: [markdown版说明 ...