openGL系列文章目录

文章目录

  • openGL系列文章目录
  • 前言
  • 一、阴影体
  • 二、阴影贴图
    • 阴影贴图(第1 轮)——从光源位置“绘制”物体
    • 阴影贴图(中间步骤)——将Z 缓冲区复制到纹理
    • 阴影贴图(第2 轮)——渲染带阴影的场景
  • 代码
  • 运行效果
  • 完成工程下载
  • 参考

前言

为了给3D 场景添加阴影,人们设计了许多有趣的方法。其中一种很适合在地平面上(如
图8.1 所示)绘制阴影,又相对不需要太大计算代价的方法,叫作投影阴影(projective
shadows)。给定一个位于(XL,YL,ZL)的点光源、一个需要渲染的物体以及一个投射阴影的
平面,可以通过生成一个变换矩阵,将物体上的点(XW,YW,ZW)变换为相应阴影在平面上的
点(XS,0,ZS)。之后将其生成的“阴影多边形”绘制出来,通常使用暗色物体与地平面纹理
混合作为其纹理,如图1所示。


图1

使用投影阴影进行投射的优点是它的高效和易于实现。但是,它仅适用于平坦表面——
这种方法无法投射阴影于曲面或其他物体。即使如此,它仍然适用于有室外场景并对性能
要求较高的应用,很多游戏中的场景都属于这类。

一、阴影体

Franklin C. Crow 在1977 年提出了另一个重要的方法,这个方法先找到被物体阴影覆盖
的阴影体,之后减少视体与阴影体相交部分中的多边形的颜色强度。图2 展示了阴影体中
的立方体,因此,立方体绘制时会更暗。
阴影体的优点在于其高度准确,比起其他方法来更不容易产生伪影。但是,计算出阴影
体以及每个多边形是否在其中这件事,即使对于现代GPU 来说,计算代价也很大。几何着
色器可以用于计算阴影体,模板缓冲区①可以用于判断像素是否在阴影体内。有些显卡对于
特定的阴影体操作优化提供了硬件支持。

图2

二、阴影贴图

阴影贴图是用于投射阴影最实用也最流行的方法之一。虽然它并不总是像阴影体一样准
确(且通常伴随着讨厌的伪影),但阴影贴图实现起来更简单,可以在各种情况下使用,并
享有强大的硬件支持。
如果我们不在这里澄清前一段中的“更简单”这个词,那将是我们的疏忽。虽然阴影贴
图比阴影体(在概念和实践中)更简单,但它绝不“简单”!对学生来说,通常在3D 图形
课程中最难实现的技术之一就是阴影贴图。着色器程序本质上很难调试,阴影贴图需要几
个组件和着色器模块的完美协调
阴影贴图基于一个非常简明的想法:光线无法看到的任何东西都在阴影中。也就是说,
如果对象#1 阻挡光到达对象#2,等同于光不能“看到”对象#2。
这个想法的强大之处在于我们已经有了方法来确定物体是否可以被“看到”——使用Z
缓冲区的隐藏面消除算法(HSR),如2.1.7 节所述。因此,计算阴影的策略是,暂时将摄像
机移动到光的位置,应用Z 缓冲区HSR 算法,然后使用生成的深度信息来计算阴影。
因此,渲染场景需要两轮:第1 轮从灯光的角度渲染场景(但实际上没有将其绘制到屏
幕上),第2 轮从摄像机的角度渲染场景。第1 轮的目的是从光的角度生成Z 缓冲区。完成
第1 轮之后,我们需要保留Z 缓冲区并使用它来帮助我们在第2 轮生成阴影。第2 轮实际
绘制场景。
我们的策略可以更加精炼。

openGL阴影实现(硬阴影)相关推荐

  1. OpenGL阴影贴图

    OpenGL阴影贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include "GL/glus ...

  2. OpenGL阴影添加学习材料及总结

    学习材料 PBR 基于物理的实时渲染 采用了更符合物理学规律的方式来模拟光线,通过模拟虚拟物体表面的粗糙程度,来计算出射该物体的光线呈现一个怎样的方式. PBR材料的三个主要参数称为:反照率.粗糙度. ...

  3. unity3d软阴影和硬阴影的原理_使用随机采样创建软阴影

    本文是OpenGL 4.0 Shading Language Cookbook的学习笔记. Shadowmap的基础实现结合PCF可以产生软阴影.但是,如果想要更大宽度的软阴影,这种方法需要增加大量采 ...

  4. unity3d软阴影和硬阴影的原理_Unity3D中两种默认阴影的实现

    Unity3D中两种阴影的实现 传统的ShadowMap ShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中. ...

  5. unity3d软阴影和硬阴影的原理_手术无影灯的原理

    手术无影灯是将灯的角度或者抛光反射面的角度调节成一种环形光照,从而达到照射部位结构凸凹形成的暗影或死角,成为亮度均匀的画片,为手术区域提供照明的专用设备. 手术无影灯是利用多点光源效应的原理设计的,即 ...

  6. unity3d软阴影和硬阴影的原理_在广告摄影中阴影和高光的重要作用和控制技巧...

    投影和高光在大多数广告摄影画面中是不可避免的(除非像无投影布光或被摄体为非光洁表面),但又往往是影像的重要的组成部分. 投影和高光的存在,既有助于造型和质感的表现,但处理不当时,又会破坏画面和使人感到 ...

  7. unity3d软阴影和硬阴影的原理_人像摄影的重要技法:控制、利用阴影

    刚接触人像摄影时,很多人对人脸上阴影十分 "忌惮",甚至因此偏好使用顺光,或通过个方位补光来完全消除阴影. 这样的操作,往往会拍出明亮.干净,对比度小的图像.或许这符合一些题材的要 ...

  8. OpenGL Shadow Mapping阴影贴图的实例

    OpenGL 阴影贴图 先上图,再解答. 正常显示 按下2键 按下3键 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示 按下2键 按下3键

  9. 可编程渲染管线4 聚光灯阴影

    原文:https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/spotlight-shadows/ 读取并渲染纹理 从 ...

最新文章

  1. 京东超大规模联邦学习探索实践
  2. 配置完centos 6以后,大概需要安装的软件(主要是yum)
  3. wxWidgets:wxObjectDataPtr< T >类模板用法
  4. WPF实现时间轴(仿Gitee)
  5. 2-sat模板- 输出可行解
  6. 永久免费!原型设计利器摹客RP正式发布
  7. 下载丨67页PDF,云和恩墨技术通讯(2021年1月刊)
  8. 前端传递参数,由于控制器层类实现了struts2的ModelDriven而产生的一个异常
  9. py2exe使用方法
  10. 学生信息管理系统(附运行效果图和源码下载)分页技术(后台封装json数据传递到前端显示,动态分页等)(Mybatis,json,ajax,jQuery实用整合示例)
  11. 201542010208、201571030331软件工程结对项目
  12. 值类型和引用类型 区别
  13. 小新黑苹果声卡ID注入
  14. python tkinter 图片_如何用python tkinter插入显示图片?
  15. c++ de-mangle 反编译器命名工具:c++filt
  16. 7 基于matplotlib的python数据可视化——导入Excel数据制作饼图
  17. ThinkPHP php 仿千图网源码_仿百度网盘文件分享dzzoffice网盘系统源码_PHP
  18. java车机_真·车载版Android来了:车机实现全部功能
  19. Autolayout使用小结(一)
  20. 切比雪夫不等式例题讲解_「高中数学」柯西不等式,最全解析,高考必备,搞定最后十分...

热门文章

  1. Git新手学习使用总结
  2. IE浏览器远程代码执行高危漏洞(CVE-2019-1367)
  3. 禅道建立项目总是没有访问权限解决办法
  4. 下载腾讯课堂回放视频
  5. 中学化学实验教室,化学实验室设备
  6. 针对Win10_1903版本VMware虚拟机繁忙问题的解决办法
  7. Rasterization
  8. 微信产品经理教你做产品:一些教义少说话,需要做更多
  9. OpenGL常用术语解析
  10. 上市公司股利政策数据( 2000-2020年)