DirectX Sample-Blobs实现原理
这个例子的实现主要包括两步:
1.计算三维采样坐标和color,实现代码是for( i = 0; i < NUM_Blobs; ++i )那个循环,计算完成以后g_pTexGBuffer[0]保存三维采样坐标,g_pTexGBuffer[1]保存颜色值。
2.实际渲染,实现代码是RenderFullScreenQuad,这个渲染不需要循环NUM_BLOBS次,对阅读代码会有误解。
注意代码中名字为g_tNormalBuffer,其实不是法向,而是采样坐标,所以下面中文写作“坐标信息
第一步最重要的是计算三维采样坐标,考虑2个blob渲染过程:
| g_tSourceBlob | g_pTexGBuffer[0] | g_pTexGBuffer[1] | g_pTexGBuffer[2] | g_pTexGBuffer[3] |
| 第1个blob g_pTexScratch | g_tNormalBuffer | g_tColorBuffer | rendertarget0 | rendertarget1 |
| 第1个draw完成 | 0 | 0 | 0 | 0 |
| g_pTexBlob | rendertarget0 | rendertarget1 | g_tNormalBuffer | g_tColorBuffer |
| 第2个draw完成 | 球1坐标信息 | 球1颜色信息 | 0 | 0 |
| 第2个blob g_pTexScratch | g_tNormalBuffer | g_tColorBuffer | rendertarget0 | rendertarget1 |
| 第1个draw完成 | 球1坐标信息 | 球1颜色信息 | 球1坐标信息 | 球1颜色信息 |
| g_pTexBlob | rendertarget0 | rendertarget1 | g_tNormalBuffer | g_tColorBuffer |
| 第2个draw完成 | 球1、2坐标信息 | 球1、2颜色信息 | 球1坐标信息 | 球1颜色信息 |
可见,在循环的每次迭代过程中,开始的时候g_pTexGBuffer[0/1]中保存上一次迭代完成以后所有球的坐标、颜色信息,第一次draw以后,将g_pTexGBuffer[0/1]保存到g_pTexGBuffer[2/3],第二次draw将当前球与已经渲染的球的信息叠加。
第二步是实际渲染过程,这一步最重要的是计算屏幕上每一个点的cubetex坐标,采用BlobLightPS实现,如果了解了上面计算过程,这个shader相对来说也不难了,此时g_pTexGBuffer[0/1]中保存迭代完成以后所有球混合以后的坐标、颜色信息。如果只需要显示一个球,不需要融合效果,可以这样实现:
代码里面设置V( g_pEffect->SetTexture( "g_tNormalBuffer", g_pTexBlob) );
shader代码改为如下:
float4 BlobLightPS1( VS_OUTPUT Input ) : COLOR
{
static const float aaval = THRESHOLD * 0.07f;
float4 blobdata = float4((Input.tCurr.x-0.5),
(Input.tCurr.y-0.5),
0,
1);// = tex2D( SourceBlobsampler, Input.tCurr);
float4 weight = tex2D(NormalBufferSampler, Input.tCurr);
blobdata *= weight.r;
float3 surfacept = float3(blobdata.x/blobdata.w,
blobdata.y/blobdata.w,
blobdata.w-THRESHOLD);
float3 thenorm = normalize(-surfacept);
thenorm.z = -thenorm.z;
float4 Output;
Output.rgb = texCUBE( EnvMapSampler, thenorm );
Output.rgb *= saturate ((blobdata.a - THRESHOLD)/aaval);
Output.a=1;
return Output;
}
附:程序中各变量
lpdirect3dtexture9 g_pTexScratch 1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT 空纹理
lpdirect3dtexture9 g_pTexGBuffer[] 640, 480, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT blob信息迭代计算使用,最后坐标与颜色信息保存在g_pTexGBuffer[0/1]中
ID3DSurface9 g_pTexBlob 二位高斯纹理
ID3DSurface9
DirectX Sample-Blobs实现原理的更多相关文章
- Spark踩坑记——初试
[TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...
- C++内存泄露调试
我在看DirectX Sample的时候,看到以下代码: // Enable run-time memory check for debug builds. #if defined(DEBUG) | ...
- Visual Studio的SDK配置
Visual Studio的SDK Visual Studio 6.0自带的SDK是1998年的,目录为C:\Program Files\Microsoft Visual Studio\VC98\,这 ...
- 一个简单、易用的Python命令行(terminal)进度条库
eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...
- python sklearn PCA源码阅读:参数n_components的设置(设为‘mle’出错的原因)
在介绍n_components参数之前,首先贴一篇PCA参数详解的文章:http://www.cnblogs.com/akrusher/articles/6442549.html. 按照文章中对于n_ ...
- Android-Messenger跨进程通信
http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- [ZZ] 基于DirectX shader的Per-pixel lighting实现
这个特效需要用到DX11 UAV吗? http://blog.tianya.cn/blogger/post_show.asp?BlogID=510979&PostID=5665974 Intr ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十章:混合
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十章:混合 代码工程地址: https://github.com/j ...
随机推荐
- Android(java)学习笔记260:JNI之native方法头文件的生成
1. JDK1.6 ,进入到工程的bin目录下classes目录下: 使用命令: javah packageName.ClassName 会在当前目录下生成头文件,从头文件找到jni协议方法 下面举 ...
- 文件操作2 cp mv rm
1.cp命令 [root@rusky /]# cp 123 /test #在linux系统中,如果文件123已经存在,则提示用户确认,在unix系统中则不提示,除非使用参数-i 交互式操作.cp: ...
- Aspose.Words导出dt到word的问题
已解决:单挑数据导入到一个word文档,导出文字和图片成功,执行Main();方法导出dt到word 待解决:多条数据(文字,图片的导入到一个word文档里面)从dt导入到word;已发现的错误提示“ ...
- c# 交换两个变量
使用临时变量: 有人会问只使用两个变量交换,怎么办? 不实用临时变量: 第一种: a=a+b; b=a-b; a=a-b; 第二种: 异或:相同是0,不同是1 上面是整型的,那么字符串可以直接异或吗? ...
- svn服务器的配置步骤
1.安装客户端: TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi下载地址:http://jaist.dl.sourceforge.net/project/torto ...
- oracle获得每周,每月,每季度,每年的第一天
当前年月日 SELECT trunc(sysdate) , trunc(sysdate,'dd') FROM dual 当年第一天 SELECT trunc(sysdate,'yyyy') FRO ...
- MySQL 数据库操作命令汇总
此文全部都是基本的数据库语言 1.登陆到mysql >mysql -h hostname -u username -p 然后等待系统提示输入密码即可登陆.如果想在登陆的时候就选择好数据库,可以使 ...
- C#模拟登录的htmlHelper类
public class HTMLHelper { /// <summary> /// 获取CooKie /// /// </summary> /// /// <para ...
- Request 分别获取具有相同 name 属性表单元素值
html 中是允许多个具有相同name属性的元素的,例如 <div> <input name="txtName" id="txtFirstName&qu ...
- google反向代理网址收集
前言 亲,还在为谷歌被墙而懊恼么?还在苦苦搜集FQ手段么?往下看吧? 最近在网站链接来源统计中,发现了很多反向代理了谷歌的链接,故搜集在这里,供需要的人使用,使用如下链接谷歌搜素不需要FQ哦?下面地址 ...