|
3D-программирование Вопросы, касающиеся программирования 3D мира |
07.02.2009, 00:14
|
#16
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
в демках Ogre3d я нашел этот самый фильтр но он напмсан на с++ а мне надо для blitz3d
//////////////////////////////////////////////
// CASTER PASS //
// HEAT //
//////////////////////////////////////////////
// vs_1_1
void HeatCaster_vp(
// in
float4 vPos: POSITION,
float4 vNormal: NORMAL,
// out
out float4 oPos: POSITION,
out float2 oNDotV: TEXCOORD0,
// parameters
uniform float4x4 worldViewProj,
uniform float3 eyePosition // object space
)
{
float4 eyeDir = float4(eyePosition - vPos.xyz, 0);
eyeDir = normalize(eyeDir);
oPos = mul( worldViewProj, vPos );
oNDotV = clamp( dot( vNormal, eyeDir ), 0, 1 );
}
// ps_2_0
float4 HeatCaster_fp(
// input from vp
float2 iNDotV: TEXCOORD0
) : COLOR0
{
return iNDotV.x;
}
//////////////////////////////////////////////
// CASTER PASS //
// COLD //
//////////////////////////////////////////////
// vs_1_1
void ColdCaster_vp(
// in
float4 vPos: POSITION,
float4 vNormal: NORMAL,
// out
out float4 oPos: POSITION,
out float2 oNDotV: TEXCOORD0,
// parameters
uniform float4x4 worldViewProj,
uniform float3 eyePosition // object space
)
{
float4 eyeDir = float4(eyePosition - vPos.xyz, 0);
eyeDir = normalize(eyeDir);
oPos = mul( worldViewProj, vPos );
oNDotV = clamp( dot( vNormal, eyeDir ), 0, 1 );
}
// ps_2_0
float4 ColdCaster_fp(
// input from vp
float2 iNDotV: TEXCOORD0
) : COLOR0
{
return iNDotV.x / 2;
}
//////////////////////////////////////////////
// PASS 1 - Light to heat conversion //
//////////////////////////////////////////////
// vs_1_1
void LightToHeat_vp(
// in
float4 inPos: POSITION,
uniform float flipping,
// out
out float4 Pos: POSITION,
out float2 uv0: TEXCOORD0
)
{
Pos = float4(inPos.x, flipping * inPos.y, 0.0f, 1.0f);
inPos.xy = sign(inPos.xy);
uv0 = (float2(inPos.x, -inPos.y) + 1.0f)/2.0f;
}
// ps_2_0
void LightToHeat_fp(
// input from vp
float4 inDiffuse: COLOR0,
float2 inUV0: TEXCOORD0,
// out
out float4 outColor: COLOR0,
// params
uniform float4 random_fractions,
uniform float4 heatBiasScale,
uniform float4 depth_modulator,
uniform sampler2D Input, // output of HeatVisionCaster_fp (NdotV)
uniform sampler2D NoiseMap,
uniform sampler2D HeatLookup
)
{
float depth, heat, interference;
// Output constant color:
depth = tex2D( Input, inUV0 );
depth *= (depth * depth_modulator);
heat = (depth * heatBiasScale.y);
// if (depth > 0)
{
interference = -0.5 + tex2D( NoiseMap, inUV0 + float2( random_fractions.x, random_fractions.y ) );
interference *= interference;
interference *= 1 - heat;
heat += interference;//+ heatBiasScale.x;
}
/*
heatBias isn't used for now
if (heat > 0)
heat += heatBiasScale.x;
*/
// Clamp UVs
heat = max( 0.005, min( 0.995, heat ) );
outColor = tex2D( HeatLookup, float2( heat, 0.f ) );
}
//////////////////////////////////////////////
// PASS 2 - add simple blur (final pass) //
//////////////////////////////////////////////
// vs_1_1
void Blur_vp(
// in
float4 inPos: POSITION,
uniform float flipping,
// out
out float4 Pos: POSITION,
out float2 uv0: TEXCOORD0
)
{
Pos = float4(inPos.x, flipping * inPos.y, 0.0f, 1.0f);
inPos.xy = sign(inPos.xy);
uv0 = (float2(inPos.x, -inPos.y) + 1.0f)/2.0f;
}
// ps_2_0
void Blur_fp(
// input from vp
float4 inDiffuse: COLOR0,
float2 inUV0: TEXCOORD0,
// out
out float4 outColor: COLOR0,
// parameters
uniform sampler2D Input, // output of HeatVision_fp1 (HeatRenderTexture)
uniform float4 blurAmount
)
{
int i;
float4 tmpOutColor;
float diffuseGlowFactor;
const float2 offsets[4] =
{
/*
// hazy blur
-1.8, -1.8,
-1.8, 1.8,
1.8, -1.8,
1.8, 1.8
*/
/*
// less-hazy blur
-1.0, 2.0,
-1.0, -1.0,
1.0, -1.0,
1.0, 1.0
*/
/*
-0.326212, -0.405805,
-0.840144, -0.073580,
-0.695914, 0.457137,
-0.203345, 0.620716
*/
-0.3, 0.4,
-0.3, -0.4,
0.3, -0.4,
0.3, 0.4
};
tmpOutColor = tex2D( Input, inUV0 ); // UV coords are in image space
// calculate glow amount
diffuseGlowFactor = 0.0113f * (2.0 - max( tmpOutColor.r, tmpOutColor.g ));
// basic blur filter
for (i = 0; i < 4; i++) {
tmpOutColor += tex2D( Input, inUV0 + blurAmount.x * diffuseGlowFactor * offsets[i] );
}
tmpOutColor *= 0.25;
// TIPS (old-skool strikes again!)
// Pay attention here! If you use the "out float4 outColor" directly
// in your steps while creating the output color (like you remove
// the "tmpOutColor" var and just use the "outColor" directly)
// your pixel-color output IS CHANGING EACH TIME YOU DO AN ASSIGNMENT TOO!
// A temporary variable, instead, acts like a per-pixel double buffer, and
// best of all, lead to better performance.
outColor = tmpOutColor;
}
|
(Offline)
|
|
07.02.2009, 00:17
|
#17
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
И еще материал
///////////////////////////////////
// PASS 0
// HEAT CASTERS PASS
///////////////////////////////////
vertex_program Fury/HeatVision/HeatCaster_vp cg
{
source HeatVision.cg
entry_point HeatCaster_vp
profiles vs_1_1 arbvp1
}
fragment_program Fury/HeatVision/HeatCaster_fp cg
{
source HeatVision.cg
entry_point HeatCaster_fp
profiles ps_2_0 arbfp1
}
material Fury/HeatVision/HeatCaster
{
technique
{
pass
{
vertex_program_ref Fury/HeatVision/HeatCaster_vp
{
param_named_auto eyePosition camera_position_object_space
param_named_auto worldViewProj worldviewproj_matrix
}
fragment_program_ref Fury/HeatVision/HeatCaster_fp
{
}
}
}
}
///////////////////////////////////
// PASS 0
// HEAT CASTERS PASS
///////////////////////////////////
vertex_program Fury/HeatVision/ColdCaster_vp cg
{
source HeatVision.cg
entry_point ColdCaster_vp
profiles vs_1_1 arbvp1
}
fragment_program Fury/HeatVision/ColdCaster_fp cg
{
source HeatVision.cg
entry_point ColdCaster_fp
profiles ps_2_0 arbfp1
}
material Fury/HeatVision/ColdCaster
{
technique
{
pass
{
vertex_program_ref Fury/HeatVision/ColdCaster_vp
{
param_named_auto eyePosition camera_position_object_space
param_named_auto worldViewProj worldviewproj_matrix
}
fragment_program_ref Fury/HeatVision/ColdCaster_fp
{
}
}
}
}
///////////////////////////////////
// PASS 1
// LIGHT TO HEAT CONVERSION PASS
///////////////////////////////////
vertex_program Fury/HeatVision/LightToHeat_vp cg
{
source HeatVision.cg
entry_point LightToHeat_vp
profiles vs_1_1 arbvp1
default_params
{
param_named_auto flipping render_target_flipping
}
}
fragment_program Fury/HeatVision/LightToHeat_fp cg
{
source HeatVision.cg
entry_point LightToHeat_fp
profiles ps_2_0 arbfp1
}
material Fury/HeatVision/LightToHeat
{
technique
{
// pass 1
pass
{
cull_hardware none
cull_software none
depth_func always_pass
vertex_program_ref Fury/HeatVision/LightToHeat_vp
{
}
fragment_program_ref Fury/HeatVision/LightToHeat_fp
{
// these should be *really* random!
param_named random_fractions float4 0.3 0.7 0 0
param_named depth_modulator float4 0.6 0 0 0
// this one can be fixed
param_named heatBiasScale float4 0.0 1.0 0 0
}
// INPUT (from scene, where entities has "Fury/HeatVision/Caster" material for heat emanation)
texture_unit
{
tex_coord_set 0
filtering linear linear none
tex_address_mode clamp
}
// Noise map
texture_unit
{
texture HeatNoise.tga
tex_coord_set 0
}
// heat conversion texture
texture_unit
{
texture HeatLookup.tga
tex_coord_set 0
filtering point point none
}
}
}
}
///////////////////////////////////
// PASS 2
// BLUR PASS
///////////////////////////////////
vertex_program Fury/HeatVision/Blur_vp cg
{
source HeatVision.cg
entry_point Blur_vp
profiles vs_1_1 arbvp1
default_params
{
param_named_auto flipping render_target_flipping
}
}
fragment_program Fury/HeatVision/Blur_fp cg
{
source HeatVision.cg
entry_point Blur_fp
profiles ps_2_0 arbfp1
}
material Fury/HeatVision/Blur
{
technique
{
// pass 1
pass
{
cull_hardware none
cull_software none
depth_func always_pass
vertex_program_ref Fury/HeatVision/Blur_vp
{
}
fragment_program_ref Fury/HeatVision/Blur_fp
{
param_named blurAmount float4 0.5 0 0 0
}
// INPUT (from previous)
texture_unit
{
texture Input
tex_coord_set 0
filtering linear linear none
tex_address_mode clamp
}
}
}
}
|
(Offline)
|
|
07.02.2009, 00:20
|
#18
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Заветное "vs_1_1" тебе ни о чём не говорит?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
07.02.2009, 00:25
|
#19
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
А что это "vs_1_1" ?
|
(Offline)
|
|
07.02.2009, 00:26
|
#20
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Я не понимаю с++
|
(Offline)
|
|
07.02.2009, 00:45
|
#21
|
|
Ответ: Как сделать инфракрасный фильтр?
Sfonsper
это шейдер
|
|
|
07.02.2009, 00:47
|
#22
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Ну по событию, например включили тепловизор, мв у всех объектов меняем текстуры нормальные на такие с разводами и градациях цвета от тёмно зелёного с желтому оранжевому и красному. в зависимости от того что нам надо показать более тёплым..текстурки наложить как сферикал мап... объектам полную яркость чтоб освешение недействовало.. вот и всё..
Можно щейдером каким нить... в любом случае это фэйк будет.. и в любом случае тёплые объекты игра должна знать чтоб их так красить..само посебе оно таким нестанет.
__________________
|
(Offline)
|
|
07.02.2009, 00:52
|
#23
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Но как тогда шейдеры в блитзе применять (исходник пожалуйста)
|
(Offline)
|
|
07.02.2009, 00:55
|
#24
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
vs - vertex shader
тут используются шейдеры, на blitz3d шейдеры подключить нет возможности, т.к. блитц3д, в отличае от огра, работает не с самым свежим графическим API (это то, что делает программные вызовы движка к видеокарте понятными самой видеокарте), а именно - DirectX 7.
Шейдеры в зачаточном виде появились впервые в DirectX 8, в полную силу (точнее, какими мы их знаем и какими, очевидно, оперирует приведенный тобой пример) они заиграли в DirectX 9.
Наиболее часто в наши дни используются высокоуровневые шейдерные языки, такие как HLSL и GLSL. Их различия в том, что HLSL работает совместно с графическим API DirectX, а GLSL - вместе с OpenGl.
Теперь вернемся к твоей проблеме.
Варианты выхода следующие:
1. Использовать Xors3D, он работает уже на DirectX 9, и, соответственно, позволяет использовать шейдеры
2. Использовать Xors3D совместно с BlitzMax - этим ты увеличишь скорость обработки математических операций (которые, несомненно, встретятся у тебя в проекте) и получишь больше возможностей абстрагирования вместе с ООП. Такой переезд приведет архитектуру твоего проекта к более С++-подобному виду, и различные "переводы" всяческих "фишечек" для огра облегчится, если ты, конечно, не поленишься переписать архитектуру проекта.
3. Использовать другие текстуры.
Я бы посоветовал делать так: самые нижние 3 слоя отдать для "тепловидения", оставшиеся 5 - на диффуз и все остальное по твоему усмотрению.
Тепловизионные текстуры:
нижний слой - фон, типа статичная температура
средний - чуть "теплее", опять же, не по всему объекту, а крупными пятнами, при "разогреве" объекта (если ты собираешься его реализовывать) его яркость можно будет увеличивать (увеличивать прозрачность слоя)
самый верхний из тепловизионных - "горячее пятно". Тепловизионная картинка в центре объекта показывает бОльшую температуру. Беда в том, что если просто наложить на объект такое пятно, то при движении объекта или камеры мы не увидим того, что пятно остается в центре. Для этого и нужно делать это пятно отдельным слоем.
При движении игрока его нужно будет двигать, обеспечивая таким образом нужный эффект. Возможно, более рационально будет применять Environment mapping, тут тебе знатоки .b3d-формата подскажут.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
|
|
07.02.2009, 01:55
|
#25
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Сообщение от ABTOMAT
Хм, а я и не знал, что цифровики "понимают" инфракрасную часть спектра Голубоватое мерчание лампочки на пульте для меня стало неожиданностью
|
на bash-е было)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.02.2009, 13:45
|
#26
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Вот эффекты камеры, в т.ч. и "инфракрасный фильтр" !!
PS1: в виндов моде некоторые эффекты неработают у меня !!
PS2: размер вложения 666.6 !!
|
(Offline)
|
|
12.02.2009, 13:59
|
#27
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Сообщение от impersonalis
на bash-е было)
|
Баш не читаем-с
в виндов моде некоторые эффекты неработают у меня !!
|
"неработают" потому что используется коррекция гаммы, которая в оконном режиме не работает в принципе.
И опять же там используются разные текстуры для ИК, от которых на ДХ7 никуда не уедешь.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
Последний раз редактировалось ABTOMAT, 12.02.2009 в 14:08.
|
(Offline)
|
|
12.02.2009, 18:50
|
#28
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Кроме как шейдером уже сказали.
Шейдером я бы делал доп текстуры, содержащие данные о тепле (простая чёрно белая картинка), для более детального отображения, записал бы в крастный канал собственное тепло, а в зелёный отражаемость, которая будет влиять от источника свера и вектора отражения, а в синий степень приёма, которую как-то придётся из шейдера сохранять, идей у меня нету, но как вы знаете нагревание поверхностей не мгновенно - и этот фактор ОЧЕНЬ важен в динамичной сцене, под инфра крастном излучении.
Далее реализовал бы раздражители на нагревание, к примеру движение объекта, сопровождается нагреванием, но реализовать этот "раздражитель" весьма геморно, и подрузумевает под собой использование дополнительного рендеринга, с записью вектора изменения позиции пикселя в мировых координатах относительно камерной матрицы.
Второй раздражитель - простой свет, он учитывает как уже говорил отражаемость поверхности.
Далее дльшего реализма, что немало украсит эффект - это динамичный Radiosity - но эта технология на столь сложна, что я вообще не рекомендую и задумываться насчёт этого. Хотя ведь тепло передаётся по воздуху, поэтому в этом случае модифицированный Radiosity - очень был бы крут.
|
(Offline)
|
|
12.02.2009, 19:03
|
#29
|
ПроЭктировщик
Регистрация: 01.02.2009
Адрес: Москва
Сообщений: 112
Написано 10 полезных сообщений (для 33 пользователей)
|
Ответ: Как сделать инфракрасный фильтр?
Спасибо.
Буду перестраивать под свою игру.
Это будет не легко делать два разных lightmap.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:55.
|