博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX Sample-Blobs实现原理
阅读量:5270 次
发布时间:2019-06-14

本文共 2126 字,大约阅读时间需要 7 分钟。

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

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 

 

 

 

 

转载于:https://www.cnblogs.com/snake-hand/p/3170417.html

你可能感兴趣的文章
国外常见互联网盈利创新模式
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>