游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2505|回复: 2

关于法线扰动,那个高手来帮我看看程序,谢谢了

[复制链接]

40

主题

48

帖子

48

积分

注册会员

Rank: 2

积分
48
发表于 2009-7-20 17:11:00 | 显示全部楼层 |阅读模式
打算实现一个基于法线扰动的环境贴图,但是实现的效果让人很费解,已经困惑了两天了,请高人赐教,以下是HLSL代码:
float4x4 matWorldViewProj;
float4x4 matWorld;
float4   EyePos;
float    time;
float4   Distortion;

texture CubeTex;
texture texNormal1;
texture texNormal2;

sampler Normal1 = sampler_state
{
   Texture = <texNormal1>;
   MinFilter = LINEAR;
   MagFilter = LINEAR;
   MipFilter = LINEAR;
   AddressU  = WRAP;
   AddressV  = WRAP;
};

sampler Normal2 = sampler_state
{
   Texture = <texNormal2>;
   MinFilter = LINEAR;
   MagFilter = LINEAR;
   MipFilter = LINEAR;
   AddressU  = WRAP;
   AddressV  = WRAP;
};

samplerCUBE CubeMapSampler = sampler_state
{
   Texture = <CubeTex>;
   MinFilter        = LINEAR;
        MagFilter        = LINEAR;
        MipFilter        = LINEAR;
        AddressU        = WRAP;
        AddressV        = WRAP;
};

struct VS_OUTPUT
{
   float4 vPosition : POSITION;
   float3 Reflect : TEXCOORD1;
   float4 color : COLOR;
   float2 tcBump0 : TEXCOORD2;
   float2 tcBump1 : TEXCOORD3;
};


VS_OUTPUT VS(float4 Pos : POSITION, float3 Normal : NORMAL, float4 vColor : COLOR, float2 TexCoord : TEXCOORD0)
{
   VS_OUTPUT output = (VS_OUTPUT)0;
   output.vPosition = mul(Pos, matWorldViewProj);
   float3 vPosW = mul(float4(Pos.x, Pos.y, Pos.z, 1.0), matWorld);
   float3 I = normalize(vPosW - EyePos);

   output.Reflect = reflect(I, Normal);
   output.tcBump0.xy = frac(time * Distortion.xy) + TexCoord.xy;
   output.tcBump1.xy = frac(time * Distortion.xy) + TexCoord.xy;
   output.color = vColor;
   
   return output;
}

float4 PS(VS_OUTPUT input) : COLOR
{
   float3 vNormal1 = tex2D(Normal1, input.tcBump0).xyz;
   float3 vNormal2 = tex2D(Normal2, input.tcBump1).xyz;
   
   vNormal1 = vNormal1 * 2.0 - 1.0;
   vNormal2 = vNormal2 * 2.0 - 1.0;
   float3 vNormal = normalize(0.5*(vNormal1+vNormal2));
   
   float3 ref = input.Reflect + 0.1*vNormal;
   float4 ReflectColor = texCUBE(CubeMapSampler, ref);
   float4 FinalColor = ReflectColor;
   return FinalColor;
}

technique TShader
{
    pass P0
    {
        VertexShader = compile vs_2_0 VS();
        PixelShader  = compile ps_2_0 PS();
    }
}

这个是源程序

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2009-7-20 19:41:00 | 显示全部楼层

Re:关于法线扰动,那个高手来帮我看看程序,谢谢了

如果没猜错的话,楼主应该是在做水面反射效果吧,嘿嘿,前几天我也在学习这个东西。。。
   output.tcBump0.xy = frac(time * Distortion.xy) + TexCoord.xy;
   output.tcBump1.xy = frac(time * Distortion.xy) + TexCoord.xy;
这两行代码实在是没看出区别,你这样的扰动和一个扰动方程是一个结果的。。。你可以这样修改一下
   output.tcBump0.xy = frac(time * Distortion.xy * 0.5) + TexCoord.xy * 2;
   output.tcBump1.xy = frac(time * Distortion.xy) + TexCoord.xy * 4;
扰动方程其实比较看rp的。。。我觉得还是找找资料吧
另外感觉代码问题不大,这个和法线图有很大关系的,法线图制作的时候不用太大,而且最后得到结果以后如果觉得扰动太大了,可以自己适当缩小vNormal的值,比如vNormal *= 0.1之类的
祝福楼主成功~

40

主题

48

帖子

48

积分

注册会员

Rank: 2

积分
48
 楼主| 发表于 2009-7-21 00:19:00 | 显示全部楼层

Re:关于法线扰动,那个高手来帮我看看程序,谢谢了

超级感谢,问题已经解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 18:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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