forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   XNA + Водичка (http://forum.boolean.name/showthread.php?t=9356)

pax 06.10.2009 09:37

XNA + Водичка
 
Я вот тут решил сделать водичку и никак не могу найти анимированной карты нормалей для этого. Хочется модифицировать вот этот примерчик для анимации водной поверхности вместо простого смещения текстурных координат в зависимости от времени...

Было бы очень хорошо, если бы был пример по созданию анимированной карты высот и превращения ее в карту нормалей, причем так, чтобы небыло швов.

И еще может кто знает ресурсы с готовыми решениями?

Я потом этот пример хочу портировать на Xen

Dream 06.10.2009 10:04

Ответ: XNA + Водичка
 
Вложений: 1
Есть пример на b3d о превращении карты высот в карту нормалей.
в атаче он. пока что не могу больше написать,, надо спешить:(

pax 06.10.2009 10:16

Ответ: XNA + Водичка
 
Ну для простого преобразования карты высот в карту нормалей я знаю утилиту по серьезднее http://nifelheim.dyndns.org/~cocidius/normalmap/. Это плугин для GIMP. Вот бесшовную анимированную водичку сделать руками... это оч сложно помоему...

pax 09.10.2009 13:45

Ответ: XNA + Водичка
 
Ну вот дошло дело до реализации, написал простой шейдер воды (отражения от кубмэпа) без преломления и отражения сцены. Есть проблема: Чем дальше камера отдаляется от центра координат, тем сильнее искажается отражение. Если кто уже писал шейдеры воды, помогите разобраться...

Код:

//CompilerOptions = ParentNamespace, InternalClass
 
float4x4 World      : WORLD;
float4x4 View        : VIEW;
float4x4 Projection  : PROJECTION;
 
float3 lightDirection = float3(-1, -1, -1);
float3 specularColor = float3(1, 1, 1);
float3 color = float3(0.6, 0.6, 1);
float  alpha = 1.0;
float  time  = 0.0;
 
float3 viewPoint    : VIEWPOINT;
 
float specularIntensity = 1.0;
float specularPower = 80;
 
texture EnvironmentMap;
sampler environmentSampler = sampler_state
{
    Texture = (EnvironmentMap);
    MAGFILTER = LINEAR;
    MINFILTER = LINEAR;
    MIPFILTER = LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};
 
texture NormalMap;
sampler normalSampler = sampler_state
{
    Texture = (NormalMap);
    MagFilter = LINEAR;
    MinFilter = LINEAR;
    Mipfilter = LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};
 
struct VertexShaderInput
{
        float4 Position      : POSITION0;
        float2 TexCoord  : TEXCOORD0;
        float3 Binormal    : BINORMAL0;
        float3 Normal              : NORMAL0;
        float3 Tangent      : TANGENT0;
};
 
struct VertexShaderOutput
{
        float4 Position      : POSITION0;
        float2 TexCoord  : TEXCOORD0;
        float3 tgtLightDir  : TEXCOORD1;
        float3 tgtEyeDir    : TEXCOORD2;
        float3 pos          : TEXCOORD3;
};
 
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;
 
        float4 pos = mul(input.Position, World);
 
        float3 viewDirection  = pos - viewPoint;
 
        pos = mul(pos, View);
        pos = mul(pos, Projection);
 
        float3x3 tgtSpace;
        tgtSpace[0] = mul(normalize(input.Tangent), World);
        tgtSpace[1] = mul(normalize(input.Binormal), World);
        tgtSpace[2] = mul(normalize(input.Normal), World);
 
        output.Position    = pos;
        output.TexCoord    = input.TexCoord + time;
        output.tgtLightDir = normalize(mul(tgtSpace, -lightDirection));
        output.tgtEyeDir  = normalize(mul(tgtSpace, viewDirection));
        output.pos = pos;
        return output;
}
 
float4 PixelShaderFunctionNoSpecular(VertexShaderOutput input): COLOR0
{       
        float3 normal = 2 * tex2D (normalSampler, input.TexCoord) - 1.0;
 
        float3 ref = reflect(input.tgtEyeDir, normal);
 
        float3 envColor = texCUBE(environmentSampler, ref.xzy);
 
        float  diffuse = saturate(dot(normal, -input.tgtLightDir));       
 
        float3 halfVector = normalize(-input.tgtLightDir + input.tgtEyeDir);
 
        float specular = specularIntensity * pow(dot(normal, halfVector), specularPower) ;
 
        return float4( color * diffuse + envColor + specular, alpha);
}
 
 
technique WaterRenderTechnique
{
    pass Pass1
    {
        VertexShader = compile vs_2_0 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunctionNoSpecular();
    }
}

Скрины работы текущего шейдера вот тут

johnk 09.10.2009 15:46

Ответ: XNA + Водичка
 
Код:

float3 viewDirection  = pos - viewPoint;
Можешь попробовать нормализовать viewDirection.

pax 09.10.2009 19:28

Ответ: XNA + Водичка
 
Пробовал, получается другой эффект, тоже неверный :(


Часовой пояс GMT +4, время: 07:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot