游戏开发论坛

 找回密码
 立即注册
搜索
楼主: firewing

我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

[复制链接]

17

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2004-12-15 10:33:00 | 显示全部楼层

Re: 我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

用的ATI的一个Shader,顺便说一下,ATI的这个Shader优化的太差了,我差不多改了一半,逼着我去学Asm shader啊!

7

主题

33

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2004-12-15 18:12:00 | 显示全部楼层

Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

再问一下,楼主,我知道应该是拼接的,但每一块的渲染都要用到到独立的递归算法,和独立的一些数据(如:高度数组、细分标志等,也许你是其他的方法,反正意思是这样的)。那你的9块区域都用到了独立的递归和数据快吗?谢谢。

9

主题

151

帖子

153

积分

注册会员

Rank: 2

积分
153
发表于 2004-12-15 18:21:00 | 显示全部楼层

Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

程序或者代码可以共享吗?

8

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2004-12-15 18:26:00 | 显示全部楼层

Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

是啊。不过我还想顺便要一份RAW文件的文件结构 :)

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2004-12-15 20:43:00 | 显示全部楼层

Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

问下楼主,大气散色的效果是怎么做出来的?提个无耻的要求,能否观摩一下你的代码?不强求~,要不告诉你参考的例子在哪里下的也行~多谢先

17

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2004-12-15 20:56:00 | 显示全部楼层

Re: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

cagain: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

再问一下,楼主,我知道应该是拼接的,但每一块的渲染都要用到到独立的递归算法,和独立的一些数据(如:高...


的确是这样,但要尽量的共享数据,实际上每个地形片只有与HeightMap相关的数据是独立的,VB,IB,Effect都是共享的,另外:不论什么时候边缘处都是最细,就不会有裂缝问题了

17

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 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_);
   }

}

17

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2004-12-15 21:08:00 | 显示全部楼层

Re: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

无法登陆: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

是啊。不过我还想顺便要一份RAW文件的文件结构 :)


raw没有任何结构,就是简单的顺序存储,比如图是257*257,用最简单的C样式的文件操作就行了:
unsigned char* pTerrainData;
pTerrainData = new unsigned char[257*257];
FILE* pFile;
fopen(“height.raw”, pFile);
fread(pTerrainData, 1, 257*257, pFile);
fclose(pFile);

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2004-12-15 21:25:00 | 显示全部楼层

Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~

看起来的确很头疼,好长啊~,而且还有汇编一样的语法~考下来看下~谢谢共享~

6

主题

76

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2004-12-15 22:31:00 | 显示全部楼层

Re: Re: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧

firewing: Re: Re:我学D3D四个月的阶段性成果,大家赏个脸看看吧~~



地形算法部分我看的是:Focus on 3D Terrain Programming,不过书的代码是opengl的,我用的是D3D

大...

能不能发一份这本书的代码给我,邮箱是feiyurainy@163.com
谢谢了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 17:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表