I’ve made a minimum version, color leaking is not handled yet.
self.tex = Texture()
self.depthmap = Texture()
self.manager = FilterManager(base.win,base.cam)
self.quad = self.manager.renderSceneInto(colortex=self.tex,depthtex=self.depthmap)
self.quad.setShader(loader.loadShader("shaders/dof.sha"))
self.quad.setShaderInput("src",self.tex)
self.quad.setShaderInput("dtex",self.depthmap)
//Cg
//Cg profile arbvp1 arbfp1
// clcheung: Depth of Field
void vshader(float4 vtx_position : POSITION,
float2 vtx_texcoord0 : TEXCOORD0,
out float4 l_position : POSITION,
out float2 l_texcoord0 : TEXCOORD0,
uniform float4 texpad_src,
uniform float4x4 mat_modelproj)
{
l_position=mul(mat_modelproj, vtx_position);
//l_texcoord0=vtx_texcoord0;
l_texcoord0 = vtx_position.xz * texpad_src.xy + texpad_src.xy;
}
float2 poissonDisk[12] = {
float2(-0.326212,-0.40508),
float2(-0.840144, -0.07358),
float2(-0.695914, 0.457137),
float2(-0.203345, 0.620716),
float2(0.96234, -0.194983),
float2(0.473434, -0.480026),
float2(0.519456, 0.767022),
float2(0.185461, -0.893124),
float2(0.507431, 0.064425),
float2(0.89642, 0.412458),
float2(-0.32194, -0.932615),
float2(-0.791559, -0.59771)
};
float4 PCF_Filter( float2 uv, float r, sampler2D map )
{
float4 sum = float4(0,0,0,0);
for ( int i = 0; i < 12; ++i ){
float2 offset = poissonDisk[i] * r;
float4 mapval = tex2D(map,uv+offset);
sum += mapval;
}
return saturate(sum / 12.0);
}
void fshader(float2 l_texcoord0 : TEXCOORD0,
out float4 o_color : COLOR,
uniform float4 k_param1,
uniform sampler2D k_src : TEXUNIT0,
uniform sampler2D k_dtex : TEXUNIT1)
{
float depth = tex2D(k_dtex, l_texcoord0).x;
float focus = k_param1.x;
float d = abs(focus - depth);
//float4 c = tex2D(k_src, l_texcoord0);
float radius = min(d * k_param1.y, k_param1.z);
o_color.rgb = PCF_Filter(l_texcoord0, radius, k_src).xyz;
o_color.w = 1;
}
See also:
developer.amd.com/media/gpu_asse … lation.pdf