摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人”   

环境贴图

环境贴图( Environment Mapping, EM )也称为反射贴图( Reflection Mapping ),用于模拟光滑表面对周围场景的映射效果,这项技术由 Blinn 和 Newell 于 1976 在文献【 10 】中提出。

本节中首先说明什么是环境贴图,然后阐述如何使用环境贴图模拟光滑表面对周围场景的映射效果。

环境贴图,顾名思义,在一副图片上展现周围的环境。环境贴图假设进行反射的光源和物体都位于很远的位置,同时反射体不会反射自身。最常被用到的环境贴图是立方体环境贴图,由 Greece 于 1986 年在文献【 11 】中提出。该方法是将相机放置在环境的最中央,然后从上、下、左、右、前、后, 6 个方向拍摄周围环境,最后将这些信息投影到立方体的 6 个面上,所得到的纹理称之为立方体环境贴图。

环境贴图的文件表现形式是一种纹理类型,例如立方体环境贴图在 DirectX 中可以保存为 .dds 格式,也很多开源图形引擎中使用 6 个方向上的二维纹理动态组成环境贴图。

如下 图 30 所示,这是 OGRE 图形引擎中提供的 2 组环境贴图。

除了立方体环境贴图,还有球面贴图、抛物面贴图。不过这两种贴图类型,与立方体环境贴图相比没有明显的优势。有兴趣的同学,可以参阅《实时计算机图形学第 2 版第 5.7.4 节》。

使用环境贴图,是为了模拟光滑表面对周围场景的映射效果。光滑表面对周围场景的映射,是由从场景出发的光线投射到光滑表面上然后被反射到人眼所形成的视觉效果,如 图 31 所示。

我们将这个过程倒退回去,从视点发射一束射线到反射体上的一个点,然后这束射线以这个点为基准进行反射,并根据反射光线的方向向量检索环境图像的颜色。这就是环境贴图算法的基本思想。

环境贴图算法的步骤如下:

1.        首先根据视线方向和法向量计算反射向量;

2.        然后使用反射向量检索环境贴图上的纹理信息;

3.        最后将该纹理信息融合到当像素颜色中。

环境贴图在 Cg 语言中属于 smaplerCUBE 类型变量,标准函数库中的 texCUBE 函数提供依据反射方向向量检索环境贴图的功能。

在代码 12 是使用立方体环境贴图实现环境映射效果的着色程序代码。在顶点着色程序中计算反射光线方向向量,然后传递到片段着色程序中,在片段着色程序中利用该方向检索环境贴图,获取纹理颜色,并进行片段赋值。整个实现过程非常简练。

代码 12 实现环境映射效果的着色代程序

void main_v( float4 position: POSITION,

float4 normal: NORMAL,

out float4 oposition : POSITION,

out float3 R : TEXCOORD1,

uniform float3 eyePosition,

uniform float4x4 modelViewProj,

uniform float4x4 modelToWorld)

{

oposition = mul( modelViewProj, position);

// 计算世界空间中的物体坐标和法向量

float3 positionW = mul( modelToWorld, position).xyz;

float3 normalW = mul( modelToWorld_IT, normal).xyz;

normalW = normalize( normalW);

float3 I = positionW - eyePosition;

// 计算反射光线 R.

R = reflect( I, normalW );

}

void main_f( float3 R : TEXCOORD1,

out float4 color : COLOR,

uniform samplerCUBE environmentMap)

{

color = texCUBE( environmentMap, R);

}

渲染效果如图 32 所示:

透明光照模型与环境贴图之2:环境贴图相关推荐

  1. arduino与java,Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境

    Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境 更多相关问题 听力原文:W: Hi, Steve, good to see you are up and around a ...

  2. PS切图保存后的背景图为透明

    1.若想PS切图保存后的背景图为透明,那么则需要在如下图中所示的修改即可,切图后[文件]-->[存储为web格式]-->[PNG-24]: 2.要想在css中的背景图片为相通,则先剪切一个 ...

  3. three.js入门篇6之 环境贴图、经纬线映射贴图与高动态范围成像HDR

    目录 013-1 环境贴图 013-2 经纬度映射贴图与HDR 013-1 环境贴图 就是把周边的环境,贴在物体的表面之上 注意:px:x轴正向,nx:x轴负向 import * as THREE f ...

  4. 史上最简SLAM零基础解读(10.1) - g2o(图优化)→简介环境搭建(slam十四讲第二版为例)

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始   文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...

  5. 图形化桌面环境中的shell脚本编程

    图形化桌面环境中的脚本编程 2.1 创建文本菜单 创建交互式 shell 脚本最常用的方法是使用菜单.提供各种选项可以帮助脚本用户了解脚本能做什么和不能做什么. 通常菜单脚本会清空显示区域,然后显示可 ...

  6. 211.Alpha多样性箱线图(样章,11图2视频)

    <微生物组数据分析与可视化实战>专著 众筹编写<微生物组数据分析与可视化实战>--成为宏基因组学百科全书的创始人(目录) 编者序:初衷.计划.要求.优势.目标和展望 本文为样章 ...

  7. 【图神经网络研究精华】图卷积网络作者Thomas Kipf博士论文公布

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 转载自:机器之心 对于普通人来说,将自己的学位论文公布到社交媒体可能需要点勇气.但 ...

  8. 在Windows环境下搭建Android开发环境

    标题:在Windows环境下搭建 Android 开发环境 作者:CrazyPebble 时间:2011年2月28日 声明:此文在参考其他网上资料以及笔者实践总结写下,一来自己可以做一些总结,二来给跟 ...

  9. linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...

    学习linux环境高级编程首先学习的是文件的操作.因为有 学习 Linux 环境高级编程,首先学习的是文件的操作.因为有一句很有趣的话"Linux 下一切皆文件".所以掌握了文件操 ...

最新文章

  1. pageResponse - 让H5适配移动设备全家(移动端适配)1
  2. linux 下Eclipse的安装
  3. 自己动手写一个服务网关
  4. c++—简单的密码本实现
  5. android contextmenu listview,Android ListView ContextMenu
  6. 数据结构与算法-java笔记一 更新中
  7. Spring源码系列 — BeanDefinition
  8. PHP简单在线二维码生成工具源码
  9. pdffactory 打印字体_pdfFactory Pro
  10. 五款优秀的端口扫描工具
  11. 神经网络模拟的优缺点是,神经网络模型的优缺点
  12. 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
  13. 快恢复二极管工作原理及使用
  14. python cv2 轮廓的包络 面积_Python科学计算——检包络与去包络
  15. 计算机硬件系统维护经验与体会,计算机操作系统维护与优化的实训报告心得体会.docx...
  16. Java中String类intern()详解
  17. 强大的头像制作神器_支持外卖CPS等优惠劵小程序源码
  18. 《千手智能打铃》使用说明
  19. eclipse第十七课时
  20. Android 文件上传

热门文章

  1. 如何用python使用递归实现1加到100
  2. Jeff Dean和李飞飞在清华谈AI:非常Excited,不能一口吃成胖子
  3. LINUX学习基础篇(三十五)日志管理
  4. 人社部发布《电子劳动合同订立指引》,加速电子劳动合同全面应用
  5. 《内网安全攻防:渗透测试实战指南》读书笔记(一):内网渗透测试基础
  6. Direct3D基本几何体 练习
  7. 成都四和能聚分析抖音起店的四大重点
  8. Echarts图表绘制,小白看了不迷路
  9. 教你结合实际工艺曲线解读压铸仿真报告
  10. 色阶的中间调调节原理——兼论色阶和曲线的联系