|
|

楼主 |
发表于 2004-12-15 21:01:00
|
显示全部楼层
Re: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~
风吹雪: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~
问下楼主,大气散色的效果是怎么做出来的?提个无耻的要求,能否观摩一下你的代码?不强求~,要不告诉你参考的例子在哪里下的也行~多谢先
地形算法部分我看的是:Focus on 3D Terrain Programming,不过书的代码是opengl的,我用的是D3D
大气散射的Shader如下,asm的,看得头痛
//--------------------------------------------------------------//
// AtmosphericScatteringEffect_ASM
//--------------------------------------------------------------//
float time : TIME;
float4 commonCont = {1.0f, 1.4427f, 0.5f, 2.0f};
float4 cloud_velocity = {0.1f, 0.1f, 0.0f, 1.0f};
float4 term_multipilers = {0.0f, 1.4f, 1.0f, 1.0f};
float4 beta = {0.0002f, 0.0008f, 0.0f, 0.0f};
float4 hg = {0.01, 0.0f, 0.0f, 0.0f};
float4 soil_reflectance_spectrum = {1.38f, 1.13f, 0.8f, 0.0f};
float4 up_vector;
float4 sun_pos;
float4 eye_pos;
float4 eye_pos_origin = {0.0f, 0.0f, 0.0f, 1.0f};
float4 sun_color = {1.0f, 1.0f, 1.0f, 1.0f};
float4 sky_color = {1.0f, 0.412741f, 0.577383f, 1.0f};
float4x4 world_view_proj : WORLDVIEWPROJECTION;
float4x4 view_matrix : VIEW;
texture Normal_Horizon;
texture Sun;
texture Terrain1;
texture Terrain2;
texture Terrain3;
texture BlendMap;
texture Cloud;
texture Bm;
texture Br;
texture Fex;
texture Cube;
sampler sCube = sampler_state
{
Texture = <Cube>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
sampler sNormal = sampler_state
{
Texture = <Normal_Horizon>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
AddressW = Clamp;
};
sampler sTerrain1 = sampler_state
{
Texture = <Terrain1>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
AddressW = Mirror;
};
sampler sTerrain2 = sampler_state
{
Texture = <Terrain2>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
AddressW = Mirror;
};
sampler sTerrain3 = sampler_state
{
Texture = <Terrain3>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
AddressW = Mirror;
};
sampler sCloud = sampler_state
{
Texture = <Cloud>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
AddressW = Mirror;
};
sampler sSun = sampler_state
{
Texture = <Sun>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
AddressW = Mirror;
};
sampler sBlendMap = sampler_state
{
Texture = <BlendMap>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
sampler sBm = sampler_state
{
Texture = <Bm>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
sampler sBr = sampler_state
{
Texture = <Br>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
sampler sFex = sampler_state
{
Texture = <Fex>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
//--------------------------------------------------------------//
// Terrain pass
//--------------------------------------------------------------//
//--------------------------------------------------------------//
// Vertex Shader
//--------------------------------------------------------------//
VertexShader Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Terrain_pass_Vertex_Shader_ = asm
{
; Scattering Vertex shader
; (c) Preetham ATI Research, 2002.
; V View direction
; L Sun direction
; Theta Scattering angle
; s Distance
; E Total extinction (including reflectance).
;
vs.2.0
dcl_position v0
dcl_texcoord0 v2
; Transformation.
m4x4 oPos, v0, c0 ; Transform position to viewport
; Texture Coordinates.
; 0 Normal/Horizon map
; 1 Terrain texture
; 2 Cloud texture
mov oT0.xy, v2
mov oT1.xy, v2
mov r1, c32
mad oT2.xy, r1, c33, v2
mov r0, c22
sub r1, v0, r0 ; V = vertex eye
dp3 r1.w, r1, r1 ; normalize V
rsq r1.w, r1.w ;
mul r1, r1, r1.w ;
mov r5, c18
mov oT5, r5
; Angle (theta) between sun direction (L) and view direction (V).
dp3 r0.x, r1, r5 ; r0.x = [cos(theta)] = V.L
mad r0.y, r0.x, r0.x, c31.x ; r0.y = [1+cos^2(theta)] = Phase1(theta)
; Distance (s)
m4x4 r1, v0, c4 ; r1.z = s
mov r0.z, r1.z ; store in r0.z for future use.
; Terms used in the scattering equation.
; r0 = [cos(theta), 1+cos^2(theta), s]
; at noon we want no shadows
dp3 r10.x, r5, c14
add r10.x, r10.x, c31.x
mul r10.x, r10.x, c31.z ; sun angle for shadowing
sub oT3, c31.x, r10.x
; Approximate theta r10.x = theta / (pi/2)
mov r10, r5
dp3 r10.x, r10, c14
max r10.x, r10.x, -r10.x ; get abs of cos(theta)
//add r10.x, r10.x, c31.x ; scale and bias cos(theta) to [0,1] range
//mul r10.x, r10.x, c31.z ; ...
mov oT4.xy, r10.x ; ;
; Extinction term E
mov r1, c26.xxx
add r1, r1, c26.yyy ; beta_1 + beta_2
mul r1, r1, -r0.z ; -(beta_1+beta_2) * s
mul r1, r1, c31.y ; -(beta_1+beta_2) * s * log_2 e
exp r1.x, r1.x ; r1 = e^(-(beta_1 + beta_2) * s) = E1
exp r1.y, r1.y
exp r1.z, r1.z
; Apply Reflectance to E to get total net effective E
mul r3, r1, c13 ;r3 = E (Total extinction)
; Phase2(theta) = (1-g^2)/(1+g-2g*cos(theta))^(3/2)
; theta is 180 actual theta (this corrects for sign)
; c[28] = [(1-g)^2, 1+g^2, 2g]
mov r8.xyz, c28.xxx
sub r8.x, c31.x, r8.x
mul r8.xy, r8.xy, r8.xy ; r8.xy = [(1-g)^2, g^2]
add r8.y, r8.y, c31.x ; r8.y = 1+g^2
mul r8.z, r8.z, c31.w // 2g
mad r4.x, r8.z, r0.x, r8.y;
rsq r4.x, r4.x
mul r4.y, r4.x, r4.x
mul r4.x, r4.y, r4.x;
mul r0.w, r4.x, r8.x ; r0.w = Phase2(theta)
; Inscattering (I) = (Beta'_1 * Phase_1(theta) + Beta'_2 * Phase_2(theta)) *
; [1-exp(-Beta_1*s).exp(-Beta_2*s)] / (Beta_1 + Beta_2)
mul r4, c26.xxx, r0.y
mul r5, c26.yyy, r0.w
sub r6, c31.x, r1
mov r1, c26.xxx
add r1, r1, c26.yyy ; beta_1 + beta_2
mov r7, r1
add r4, r4, r5
mul r4, r4, r6
rcp r1.x, r1.x
mul r4, r4, r1.xxx ; r4 = I (inscattering)
; Apply Inscattering contribution factors.
mul r4, r4, c25.y
; Scale with Sun color & intesity.
mul r4, r4, c15
mul r4, r4, c15.w
mul r3, r3, c15
mul r3, r3, c15.w
; Outputs.
mov oD0, r3 ; Extinction
mov oD1, r4 ; Inscattering
};
//--------------------------------------------------------------//
// Pixel Shader
//--------------------------------------------------------------//
PixelShader Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Terrain_pass_Pixel_Shader_ = asm
{
; Terrain Pixel shader with Scattering
; (c) Kenny Mitchell Westwood Studios EA 2002
; (c) Preetham ATI Research, 2002.
ps.2.0
; Equation is
;
; Surf_color = (N.L) * terrain_tex * cloud_covering * self_shadow_term;
; Final_color = Surf_color * extinction + inscattering
;
;
; Inputs:
; VP_EXTINCTION (v0)
; VP_INSCATTERING (v1)
;
def c7, 0.2f, 0.1f, 0.1f, 1.0f
def c8, -1.0f, 2.0f, 0.0f, 0.0f
def c9, 8.0f, 1.0f, 0.0f, 0.0f
dcl v0.xyzw
dcl v1.xyzw
dcl t0.xy
dcl t1.xy
dcl t2.xy
dcl t3.xyz
dcl t4.xy
dcl t5.xyz
dcl_2d s0
dcl_2d s1
dcl_2d s2
dcl_2d s3
dcl_2d s4
dcl_2d s5
dcl_2d s6
mul r10.xy, t1, c9.x
texld r0, t0, s0 ; Normal Horizon map
texld r1, r10, s1 ; Terrain1 color
texld r7, r10, s4 ; Terrain2 color
texld r8, r10, s5 ; Terrain3 color
texld r9, t1, s6 ; BlendMap color
texld r2, t2, s2 ; Cloud layer
texld r3, t4, s3 ; Sun attenuation map
mul r8.xyzw, r8.xyzw, r9.z
mad r7.xyzw, r7.xyzw, r9.y, r8
mad r1.xyzw, r1.xyzw, r9.x, r7
mov r1.w, c9.y
mov r4.rgb, t3 ; Horizon angle for shadows
mov r5.rgb, t5 ; L
mov r4.a, r4.r
mad r6.rgb, r0, c8.y, c8.x
dp3_sat r0.rgb, r5, r6 ; Lighting (N.L)
mul r5, v0, r3
mul r3, v1, r3
mul r0.rgb, r0, r1 ; Terrain texture.
sub_sat r0.a, r4.a, r0.a ; Shadow term (from Horizon angle)
mad r0, -r0, r0.a, r0 ; Add Shadow.
mad r0, -r0, r2, r0 ; Add cloud covering
mad_sat r0, r0, r5, r3 ; Final color
mov oC0, r0
};
//--------------------------------------------------------------//
// Sky Dome
//--------------------------------------------------------------//
//--------------------------------------------------------------//
// Vertex Shader
//--------------------------------------------------------------//
VertexShader Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Sky_Dome_Vertex_Shader_ = asm
{
; Scattering Vertex shader
; (c) Preetham ATI Research, 2002.
; V View direction
; L Sun direction
; Theta Scattering angle
; s Distance
; E Total extinction (including reflectance).
;
vs.2.0
dcl_position v0
//dcl_normal v1
dcl_texcoord0 v2
dcl_texcoord1 v5
//dcl_tangent v3
//dcl_binormal v4
; Transformation.
m4x4 r10, v0, c0 ; Transform position to viewport
mov oPos, r10.xyww
dp3 r10.x, v0, v0
rsq r10.w, r10.x
mul oT4.xyz, r10.w, v0
; Texture Coordinates.
; 0 Normal/Horizon map
; 1 Terrain texture
; 2 Cloud texture
mov oT0.xy, v2
mov r1, c22 ; get eye position in eye space (origin)
sub r1, r1, v0 ; V = vertex eye
dp3 r1.w, r1, r1 ; normalize V
rsq r1.w, r1.w ;
mul r1, r1, r1.w ;
mov r5, -c18
; Angle (theta) between sun direction (L) and view direction (V).
dp3 r0.x, r1, r5 ; r0.x = [cos(theta)] = V.L
//sub r0.x, c31.x, r0.x ;; <-?
mul r0.x, r0.x, c31.z ; scale & bias into [0,1] range
add r0.x, r0.x, c31.z
mov r0.y, c26.x ; beta_r
//sub r0.y, c31.x, r0.y ; complement since d3d's texture origin at top left
mov oT1, r0.xy
mov r0.y, c26.y ; beta_m
//sub r0.y, c31.x, r0.y ; complement since d3d's texture origin at top left
mov oT2, r0.xy
dp3 r0.x, c14, r5
max r0.x, r0.x, -r0.x
mov oT5, r0.xxx
};
//--------------------------------------------------------------//
// Pixel Shader
//--------------------------------------------------------------//
PixelShader Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Sky_Dome_Pixel_Shader_ = asm
{
; Sky Pixel Shader
ps.2.0
dcl t1.xy
dcl t2.xy
//dcl t3.xy
dcl t4.xyz
dcl t5.xy
dcl_2d s0
dcl_2d s1
dcl_2d s2
dcl_cube s4
//dcl_2d s3
texld r0, t5, s0 ; sun attenuation
texld r1, t1, s1 ; Br(theta, beta_r)
texld r2, t2, s2 ; Bm(theta)
texld r4, t4, s4 ; CubeMap
//texld r3, t3, s3 ; Fex(s)
//mov r4.xyz,t2 ; z = 1/(betam + betar)
add r1.x, r1.x, r2.x ; Br(theta) + Bm(theta)
//mul r3, r3.xxx, c4 ; Extintction * Soil Reflectance = Etotal
//sub r2, c1.xxx, r3 ; 1 Etotal
//mul r1, r1.xxx, r2 ; Lin(theta) = (Br(theta) + Bm(theta)) * (1-Etotal)
mul r0, r0, r1.x ; Lin(theta) * Sun Attenuation
mul r4, r0, r4
add r0, r0, r4
mov oC0, r0
};
technique AtmosphericScatteringEffect_ASM
{
pass Terrain_pass
{
ZENABLE = TRUE;
FILLMODE = SOLID;
ZWRITEENABLE = TRUE;
ZFUNC = LESS;
ALPHABLENDENABLE = FALSE;
VertexShaderConstant4[0] = <world_view_proj>;
VertexShaderConstant4[4] = <view_matrix>;
VertexShaderConstant1[13] = <soil_reflectance_spectrum>;
VertexShaderConstant1[14] = <up_vector>;
VertexShaderConstant1[15] = <sun_color>;
VertexShaderConstant1[18] = <sun_pos>;
VertexShaderConstant1[22] = <eye_pos>;
VertexShaderConstant1[25] = <term_multipilers>;
VertexShaderConstant1[26] = <beta>;
VertexShaderConstant1[28] = <hg>;
VertexShaderConstant1[31] = <commonCont>;
VertexShaderConstant1[32] = <time>;
VertexShaderConstant1[33] = <cloud_velocity>;
Sampler[0] = <sNormal>;
Sampler[1] = <sTerrain1>;
Sampler[4] = <sTerrain2>;
Sampler[5] = <sTerrain3>;
Sampler[6] = <sBlendMap>;
Sampler[2] = <sCloud>;
Sampler[3] = <sSun>;
VertexShader = (Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Terrain_pass_Vertex_Shader_);
PixelShader = (Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Terrain_pass_Pixel_Shader_);
}
pass Sky_Dome
{
Cullmode = none;
Zenable = true;
Zwriteenable = true;
Zfunc = always;
StencilEnable = true;
StencilFunc = always;
StencilPass = replace;
StencilRef = 0;
AlphaBlendEnable = false;
VertexShaderConstant4[0] = <world_view_proj>;
VertexShaderConstant4[4] = <view_matrix>;
VertexShaderConstant1[13] = <soil_reflectance_spectrum>;
VertexShaderConstant1[14] = <up_vector>;
VertexShaderConstant1[18] = <sun_pos>;
VertexShaderConstant1[22] = <eye_pos_origin>;
VertexShaderConstant1[25] = <term_multipilers>;
VertexShaderConstant1[26] = <beta>;
VertexShaderConstant1[28] = <hg>;
VertexShaderConstant1[31] = <commonCont>;
VertexShaderConstant1[32] = <time>;
VertexShaderConstant1[33] = <cloud_velocity>;
PixelShaderConstant1[0] = <sky_color>;
PixelShaderConstant1[4] = <soil_reflectance_spectrum>;
Sampler[0] = <sSun>;
Sampler[1] = <sBr>;
Sampler[2] = <sBm>;
Sampler[3] = <sFex>;
Sampler[4] = <sCube>;
VertexShader = (Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Sky_Dome_Vertex_Shader_);
PixelShader = (Atmospheric_Effects_AtmosphericScatteringEffect_ASM_Sky_Dome_Pixel_Shader_);
}
} |
|