几种绘制阴影的方法

在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. ListView属性及divider设置分割线

    给ListView设置分割线,只需设置如下两个属性: android:divider="#000" //设置分割线显示颜色 android:dividerHeight=" ...

  2. java基础笔记(2)----流程控制

    java流程控制结构包括顺序结构,分支结构,循环结构. 顺序结构: 程序从上到下依次执行,中间没有任何判断和跳转. 代码如下: package com.lvsling.test; public cla ...

  3. Wannafly交流赛1(施工中)

    A.有理数 签到题:直接用floor函数就行了,详细看代码 #define debug #include<stdio.h> #include<math.h> #include& ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14

    第一次会议:2017-11-14 额--这几天比较忙,忘记上传了,今天补上 先上个图,O(∩_∩)O哈哈: 会议主要内容: 1. 讨论整体框架 2. 个人具体分工 3. 代码统一 具体分工: 成员 计 ...

  5. [USACO13JAN] Seating

    https://www.luogu.org/problem/show?pid=3071 题目描述 To earn some extra money, the cows have opened a re ...

  6. java的socket通信

    本文讲解如何用java实现网络通信,是一个非常简单的例子,我比较喜欢能够立马看到结果,所以先上代码再讲解具体细节. 服务端: import java.io.BufferedReader; import ...

  7. 自己动手写CPU(基于FPGA与Verilog)

    大三上学期开展了数字系统设计的课程,下学期便要求自己写一个单周期CPU和一个多周期CPU,既然要学,就记录一下学习的过程. CPU--中央处理器,顾名思义,是计算机中最重要的一部分,功能就是周而复始地 ...

  8. 根据HTML5的新方法 drag & drop 方法实现表格拖拽实例

    上一次学习了html5的drag和drop方法,传送门  就自己写了个例子加深自己对drag和drop的理解.不过一开始不是很简单,遇到了不少问题.还好网络万能的,什么都能查到,总算完成了. 说明和详 ...

  9. Python 简单聊天室

    #coding=utf-8 from socket import * from threading import Thread import time udpSocket = socket(AF_IN ...

  10. SpringCloud是否值得引入?

    中小型互联网公司微服务实践-经验和教训 http://xujin.org/sc/sc-zq/#more Spring Cloud在国内中小型公司能用起来吗?https://mp.weixin.qq.c ...