几种绘制阴影的方法

在OpenGL中,比较常见的绘制阴影的方法有:shadow mapping,shadow volumes以及一种在红宝书上提及的适合在确定平面上绘制阴影的方法。

平面阴影

在确定的平面下,可以直接通过模版测试,经过变换矩阵来显示阴影。具体的过程如下:

  1. 开启模板测试,初始化模板缓冲区为0
  2. 模板测试设置为所有绘制都能通过,绘制地面,所有通过缓冲测试值设为1
  3. 禁用光照,禁用深度测试
  4. 修改模板测试条件,只有等于1的才能通过,通过测试则递增
  5. 创建阴影矩阵
  6. 加载阴影矩阵,绘制场景中除地面外的所有物体
  7. 开启光照,启用深度测试,禁用模板测试

接下来是阴影矩阵的计算方法

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平面阴影的更多相关文章

  1. OpenGL阴影,Shadow Mapping(附源程序)

    实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...

  2. 如何使用Android中的OpenGL ES媒体效果

    引自:http://www.2cto.com/kf/201506/404366.html Android的媒体效果框架允许开发者可以很容易的应用多种令人印象深刻的视觉效果到照片或视频之上.作为这个媒体 ...

  3. 由浅入深学习PBR的原理和实现

    目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...

  4. 使用WebGL + Three.js制作动画场景

    使用WebGL + Three.js制作动画场景 3D图像,技术,打造产品,还有互联网:这些只是我爱好的一小部分. 现在,感谢WebGL的出现-一个新的JavaScriptAPI,它可以在不依赖任何插 ...

  5. [ZZ] D3D中的模板缓存(3)

    http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的 ...

  6. MATLAB绘图与图形处理

    参考:http://www.cnblogs.com/djcsch2001/tag/MATLAB/  matlab部分写的不错! 7.2  三维图形 7.2.1  三维曲线.面填色命令 命令1  com ...

  7. 基于 Android 的 3D 视频示例代码

    笔者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...

  8. 基于 Android 的 3D 视频样本代码

    作者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...

  9. DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制

    前言 到现在为止,所有的教程项目都没有使用Effects11框架类来管理资源.因为在D3DCompile API (#47)版本中,如果你尝试编译fx_5_0的效果文件,会收到这样的警告: X4717 ...

随机推荐

  1. Algorithm --> 二进制中1的个数

    行文脉络 解法一——除法 解法二——移位 解法三——高效移位 解法四——查表 扩展问题——异或后转化为该问题 对于一个字节(8bit)的变量,求其二进制“1”的个数.例如6(二进制0000 0110) ...

  2. zabbix通过SNMP监控服务器硬件及构建触发器

    公司的服务器没装系统无法使用IPMI协议来监控服务器硬件信息,所以我们使用SNMP来获取,下面介绍如何通过SNMP监控服务器硬件信息. 1.HP服务器进入iLO开启SNMP协议. 2.查看服务器温度信 ...

  3. Oracle之SQL优化专题01-查看SQL执行计划的方法

    在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...

  4. Django Haystack 全文检索与关键词高亮

    Django Haystack 简介 django-haystack 是一个专门提供搜索功能的 django 第三方应用,它支持 Solr.Elasticsearch.Whoosh.Xapian 等多 ...

  5. 过滤器Filter与监听器Listener

    过滤器Filter 过滤器也是一种servlet   它也可以对用户的请求进行处理  , 但是他所做的处理,只是一些轻量级的处理.Fileter就好像jsp页面与servlet之间的一道关卡,如果这个 ...

  6. VS2013 重装 无法打开项目

    今天遇到的奇葩BUG,耗时我一下午,现在跟大家说道说道. 今天重装系统,让各种开发环境开发工具自然要重装一次,最后装完VS2013,然后刚好客户打电话要改点东西,然后我就双击项目准备打开改,然后奇葩来 ...

  7. jQuery 写的textarea输入字数限制

    //先判断浏览器是不是万恶的IE        var bind_name = 'input';//默认事件        if (navigator.userAgent.indexOf(" ...

  8. surging教学视频资源汇总

    surging是什么 surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询.压力最小优先作 ...

  9. 微信小程序tab(swiper)切换

    <- wxml -> <view class="youhui"> <view ' bindtap='toggle'> 未使用 </view ...

  10. Flow简易教程——安装篇

    .mydoc_h1{ margin: 0 0 1em; } .mydoc_h1_a{ color: #2c3e50; text-decoration: none; font-size: 2em; } ...