这个例子的实现主要包括两步:

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实现原理的更多相关文章

  1. Spark踩坑记——初试

    [TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...

  2. C++内存泄露调试

    我在看DirectX Sample的时候,看到以下代码: // Enable run-time memory check for debug builds. #if defined(DEBUG) | ...

  3. Visual Studio的SDK配置

    Visual Studio的SDK Visual Studio 6.0自带的SDK是1998年的,目录为C:\Program Files\Microsoft Visual Studio\VC98\,这 ...

  4. 一个简单、易用的Python命令行(terminal)进度条库

    eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...

  5. python sklearn PCA源码阅读:参数n_components的设置(设为‘mle’出错的原因)

    在介绍n_components参数之前,首先贴一篇PCA参数详解的文章:http://www.cnblogs.com/akrusher/articles/6442549.html. 按照文章中对于n_ ...

  6. Android-Messenger跨进程通信

    http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...

  7. 深度学习原理与框架-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进行响应归一化操作 参数 ...

  8. [ZZ] 基于DirectX shader的Per-pixel lighting实现

    这个特效需要用到DX11 UAV吗? http://blog.tianya.cn/blogger/post_show.asp?BlogID=510979&PostID=5665974 Intr ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十章:混合

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十章:混合 代码工程地址: https://github.com/j ...

随机推荐

  1. OC与JS互相调用

    近期项目中要用到html5来实现.涉及到OC调用JS,以及JS调用OC的方法.这里把遇到的问题以及实现方法介绍一下. // // ViewController.h // OC_And_JS // // ...

  2. [ES6] Objects create-shorthand && Destructuring

    Creating Object: Example 1: let name = "Brook"; let totalReplies = 249; let avatar = " ...

  3. ios 基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果demo

    demo功能:基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果. demo说明:基于Core Animation的粒子发射系统,粒子用CAEmitterCell来初始化. 粒子画在背景层 ...

  4. 关于js中 document.body.scrollTop 不能返回正确值的原因

    本来是为了通过document.body.scrollTop来获取浏览器垂直滚动条向下滚动的像素,但是不管滚动条在什么位置总是返回是0,造成这样的原因和html的头部声明有关,如果头部声明 为:< ...

  5. Linux实现密钥登陆

    公司为了安全,一直都采用密钥登陆远程SSH,现在有了自己的服务器,自己又学者配了一把,下面就是配置笔记. 1.登陆未设置密钥的Linux服务器 2.工具新建用户密钥生成向导 3.选择生成密钥的加密方式 ...

  6. python:字符串取值

    某个字符串为stmp="abcdef54321" 取前面5个stmp[:5] #abcde 取后面5个stmp[-5:] #54321 从前面开始取,不包括最后两个stmp[:-2 ...

  7. python模块基础之OS模块

    OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> import os #导入os模块 ...

  8. Head First HTML与CSS — 布局与定位

    1.流(flow)是浏览器在页面上摆放HTML元素所用的方法. 对于块元素,浏览器从上到下沿着元素流逐个显示所遇到的各个元素,会在每个块元素之间加一个换行: 对于内联元素,在水平方向会相互挨着,总体上 ...

  9. <httpProtocol/>配置http协议头

    Web.Config中的位置 <configuration> <system.webServer> <httpProtocol> <!--http协议内容-- ...

  10. lvm拉伸逻辑卷分区小总结

    文件系统                                      容量     已用      可用     已用% 挂载点 /dev/mapper/vg_znl-lv_root   ...