|
С# Средство разработки на платформе .Net |
06.10.2009, 09:37
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
XNA + Водичка
Я вот тут решил сделать водичку и никак не могу найти анимированной карты нормалей для этого. Хочется модифицировать вот этот примерчик для анимации водной поверхности вместо простого смещения текстурных координат в зависимости от времени...
Было бы очень хорошо, если бы был пример по созданию анимированной карты высот и превращения ее в карту нормалей, причем так, чтобы небыло швов.
И еще может кто знает ресурсы с готовыми решениями?
Я потом этот пример хочу портировать на Xen
|
(Offline)
|
|
06.10.2009, 10:04
|
#2
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: XNA + Водичка
Есть пример на b3d о превращении карты высот в карту нормалей.
в атаче он. пока что не могу больше написать,, надо спешить
|
(Offline)
|
|
06.10.2009, 10:16
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: XNA + Водичка
Ну для простого преобразования карты высот в карту нормалей я знаю утилиту по серьезднее http://nifelheim.dyndns.org/~cocidius/normalmap/. Это плугин для GIMP. Вот бесшовную анимированную водичку сделать руками... это оч сложно помоему...
|
(Offline)
|
|
09.10.2009, 13:45
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: 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();
}
}
Скрины работы текущего шейдера вот тут
|
(Offline)
|
|
09.10.2009, 15:46
|
#5
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: XNA + Водичка
float3 viewDirection = pos - viewPoint;
Можешь попробовать нормализовать viewDirection.
|
(Offline)
|
|
09.10.2009, 19:28
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: XNA + Водичка
Пробовал, получается другой эффект, тоже неверный
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Растягиваем боди. |
Данил |
Проекты на BlitzMax |
6 |
20.11.2009 04:55 |
Водичка |
Render |
Алгоритмика |
7 |
01.01.2007 14:09 |
Водичка . |
Conan Fedr |
3D-программирование |
16 |
24.02.2006 17:33 |
Часовой пояс GMT +4, время: 18:34.
|