Скачать 0.59 Mb.
|
offset = normalize(float3(offset.xy, -offset.z)) * g_max_height; In.TextureUV += height * offset; // Lookup texture float3 TexColor = tex2D(ColorTextureSampler, In.TextureUV).rgb; float3 n = FetchNormal(NormalHeightTextureSampler, In.TextureUV); if (g_rendering_mode == RENDERING_MODE_LOCAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((normalize(n) + 1) * .5f, 1); n = normalize(mul(n, (float3x3)g_mWorld)); if (g_rendering_mode == RENDERING_MODE_WORAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((n + 1) * .5f, 1); Output.RGBColor.rgb = BlinnPhong(TexColor, n, v, l); Output.RGBColor.a = 1.0; if (g_reflections) { // find reflection direction in world space float3 reflect_dir = reflect(-v, n); // Lookup cube map float3 reflect_color = texCUBE(CubeMapSampler, reflect_dir); // Combine with previous color Output.RGBColor.rgb = lerp(Output.RGBColor.rgb, reflect_color, g_reflectance); } if (g_rendering_mode == RENDERING_MODE_FINAL) return Output; return (PS_OUTPUT)0; } //-------------------------------------------------------------------------------------- // Parallax Mapping 2 pixel shader //-------------------------------------------------------------------------------------- PS_OUTPUT ParallaxMapping_2_PS(TRANSFORM_VS_OUTPUT In) { PS_OUTPUT Output; // view and light directions float3 v = normalize(g_Eye - In.WorldPos); float3 l = g_WorldLightDir; // parallax float height = (1.0 - tex2D(NormalHeightTextureSampler, In.TextureUV).w) * g_max_height; float3 offset = mul((float3x3)g_mWorld, v); offset = float3(offset.xy, -offset.z); offset *= g_max_height / offset.z; In.TextureUV += height * offset; // Lookup texture float3 TexColor = tex2D(ColorTextureSampler, In.TextureUV).rgb; float3 n = FetchNormal(NormalHeightTextureSampler, In.TextureUV); if (g_rendering_mode == RENDERING_MODE_LOCAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((normalize(n) + 1) * .5f, 1); n = normalize(mul(n, (float3x3)g_mWorld)); if (g_rendering_mode == RENDERING_MODE_WORAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((n + 1) * .5f, 1); Output.RGBColor.rgb = BlinnPhong(TexColor, n, v, l); Output.RGBColor.a = 1.0; if (g_reflections) { // find reflection direction in world space float3 reflect_dir = reflect(-v, n); // Lookup cube map float3 reflect_color = texCUBE(CubeMapSampler, reflect_dir); // Combine with previous color Output.RGBColor.rgb = lerp(Output.RGBColor.rgb, reflect_color, g_reflectance); } if (g_rendering_mode == RENDERING_MODE_FINAL) return Output; return (PS_OUTPUT)0; } //-------------------------------------------------------------------------------------- // Parallax Occlusion Mapping pixel shader //-------------------------------------------------------------------------------------- // Search intersection point in (+T +B -N) space static float start_diff; bool LinearSearch(in float3 dir, out float3 delta, inout float3 offset, in float2 uv, in float2 dx, in float2 dy, in float linear_search_delta, inout int steps) { if (dir.z > 0) { // search down delta = dir / dir.z; delta *= g_max_height - offset.z; } else { // search up delta = dir / -dir.z; delta *= offset.z; } float2 delta_tex = abs(delta.xy); const float2 target_delta_tex = linear_search_delta / g_normal_height_map_res; float2 delta_scale_xy = target_delta_tex / delta_tex; float delta_scale = min(min(delta_scale_xy.x, delta_scale_xy.y), 1); delta *= delta_scale; start_diff = tex2Dgrad(NormalHeightTextureSampler, uv + offset, dx, dy).w * g_max_height - offset.z; int cur_step = 0; bool no_intersect = true; while (offset.z <= g_max_height && offset.z >= 0 && (no_intersect = (tex2Dgrad(NormalHeightTextureSampler, uv + offset, dx, dy).w * g_max_height - offset.z) * start_diff > 0)) { cur_step++; offset += delta; steps++; } return no_intersect; } void BinarySearch(inout float3 dir, inout float3 delta, inout float3 offset, out float3 offset_back, in float2 uv, in float2 dx, in float2 dy, in int binary_search_steps, inout int steps) { offset_back = offset - delta; if (start_diff != 0) { float delta_len = length(delta); for (int cur_step = 0; cur_step < binary_search_steps; cur_step++) { delta *= 0.5; if ((tex2Dgrad(NormalHeightTextureSampler, uv + offset, dx, dy).w * g_max_height - offset.z) * start_diff > 0) { // outside if (delta_len > g_max_raytrace_bias) offset_back = offset; offset += delta; } else // inside offset -= delta; delta_len *= 0.5; } steps += binary_search_steps; } } PS_OUTPUT ParallaxOcclusionMapping_PS(TRANSFORM_VS_OUTPUT In) { PS_OUTPUT Output; bool grads_from_base_plane; float2 IntersectUV, // offset texcoords dx, dy; // corresponding grads int overall_search_steps = 0; // view and light directions float3 local_view = In.WorldPos - g_Eye; float3 local_light = g_WorldLightDir; // transform in (+T +B -N) space local_view = mul((float3x3)g_mWorld, local_view); float3 delta; // offset in (+T +B -N) space float3 offset = 0, offset_back; // compute gradients in base plane float2 base_dx, base_dy; float4(base_dx, base_dy) = float4(ddx(In.TextureUV), ddy(In.TextureUV)); // search intersection in view direction LinearSearch(local_view, delta, offset, In.TextureUV, base_dx, base_dy, g_linear_search_delta, overall_search_steps); BinarySearch(local_view, delta, offset, offset_back, In.TextureUV, base_dx, base_dy, g_binary_search_steps, overall_search_steps); // offset texture coords IntersectUV = In.TextureUV + offset; // transform base offset in world space float3 obj_offset = offset / g_tex_scale; // in object space float3 world_offset = mul(obj_offset, (float3x3)g_mWorld); // Intersection point in world space (used for lighting direction computation for point light sources) float3 world_pos = In.WorldPos + world_offset; // return (PS_OUTPUT)float4(obj_offset * 0.5 + 0.5, 1); float shadow_factor; // search intersection in light direction if (g_cast_shadows) { local_light = mul((float3x3)g_mWorld, local_light); // in (+T +B -N) space offset = offset_back; shadow_factor = LinearSearch(local_light, delta, offset, In.TextureUV, base_dx, base_dy, g_linear_search_delta, overall_search_steps); } else shadow_factor = 1; // lookup texture float3 TexColor; float3 n; if (g_grad_method == GRAD_METHOD_STD) grads_from_base_plane = false; else if (g_grad_method == GRAD_METHOD_BASE_PLANE) grads_from_base_plane = true; else if (g_grad_method == GRAD_METHOD_HYBRID) { float4(dx, dy) = float4(ddx(IntersectUV), ddy(IntersectUV)); grads_from_base_plane = max(dot(dx, dx), dot(dy, dy)) > g_grad_threshold; } else return (PS_OUTPUT)0; //float4(dx, dy) = float4(ddx(IntersectUV), ddy(IntersectUV)); //if (g_grad_method == GRAD_METHOD_BASE_PLANE || g_grad_method == GRAD_METHOD_HYBRID && max(dot(dx, dx), dot(dy, dy)) > g_grad_threshold) if (grads_from_base_plane) { TexColor = tex2Dgrad(ColorTextureSampler, IntersectUV, base_dx, base_dy).rgb; n = FetchNormal(NormalHeightTextureSampler, IntersectUV, base_dx, base_dy).xyz; } else { TexColor = tex2D(ColorTextureSampler, IntersectUV).rgb; n = FetchNormal(NormalHeightTextureSampler, IntersectUV).xyz; } if (g_height_diff_samples == 0) // normal from normal map n.z *= 0.5 / g_max_height; n = normalize(n); float3 local_normal = n; if (g_rendering_mode == RENDERING_MODE_LOCAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((local_normal + 1) * .5f, 1); n = normalize(mul(n, (float3x3)g_mWorld)); if (g_rendering_mode == RENDERING_MODE_WORAL_NORMAL) // pack normal [-1..1]->[0..1] and output return (PS_OUTPUT)float4((n + 1) * .5f, 1); float3 v = normalize(g_Eye - In.WorldPos); float3 l = g_WorldLightDir; Output.RGBColor.rgb = BlinnPhong(TexColor, n, v, l, shadow_factor); // search intersection in reflection direction if (g_reflections) { offset = offset_back; float3 local_reflect = reflect(local_view, local_normal); bool cube_map_reflect = LinearSearch(local_reflect, delta, offset, In.TextureUV, base_dx, base_dy, g_linear_search_delta, overall_search_steps); // Transoform reflection direction in world space // Length is meaningless, so it is not required to transform from unnormalized (+T +B -N) space to normalized (+t +b -n) space (object space) (in general case transformation in tangent space required) // Normalize for lighting calculations (normalization not required if g_mWorld orthogonal) float3 world_reflect = normalize(mul(local_reflect, (float3x3)g_mWorld)); if (cube_map_reflect) { float3 reflect_color = texCUBE(CubeMapSampler, world_reflect).rgb; Output.RGBColor.rgb = lerp(Output.RGBColor.rgb, reflect_color, g_reflectance); } else { BinarySearch(local_reflect, delta, offset, offset_back, In.TextureUV, base_dx, base_dy, g_binary_search_steps, overall_search_steps); // transform offset in world space obj_offset = offset / g_tex_scale; // in object space world_offset = mul(obj_offset, (float3x3)g_mWorld); // Intersection point in world space (used for lighting direction computation for point light sources) world_pos = In.WorldPos + world_offset; // offset texture coords IntersectUV = In.TextureUV + offset; if (g_grad_method == GRAD_METHOD_STD) grads_from_base_plane = false; else if (g_grad_method == GRAD_METHOD_BASE_PLANE) grads_from_base_plane = true; else if (g_grad_method == GRAD_METHOD_HYBRID) { float4(dx, dy) = float4(ddx(IntersectUV), ddy(IntersectUV)); grads_from_base_plane = max(dot(dx, dx), dot(dy, dy)) > g_grad_threshold; } else return (PS_OUTPUT)0; //float4(dx, dy) = float4(ddx(IntersectUV), ddy(IntersectUV)); //if (g_grad_method == GRAD_METHOD_BASE_PLANE || g_grad_method == GRAD_METHOD_HYBRID && max(dot(dx, dx), dot(dy, dy)) > g_grad_threshold) if (grads_from_base_plane) { TexColor = tex2Dgrad(ColorTextureSampler, IntersectUV, base_dx, base_dy).rgb; n = FetchNormal(NormalHeightTextureSampler, IntersectUV, base_dx, base_dy).xyz; } else { TexColor = tex2D(ColorTextureSampler, IntersectUV).rgb; n = FetchNormal(NormalHeightTextureSampler, IntersectUV).xyz; } if (g_cast_shadows) { offset = offset_back; shadow_factor = LinearSearch(local_light, delta, offset, In.TextureUV, base_dx, base_dy, g_linear_search_delta, overall_search_steps); } else shadow_factor = 1; if (g_height_diff_samples == 0) // normal from normal map n.z *= 0.5 / g_max_height; n = normalize(mul(n, (float3x3)g_mWorld)); float3 reflect_color = BlinnPhong(TexColor, n, -world_reflect, l, shadow_factor); Output.RGBColor.rgb = lerp(Output.RGBColor.rgb, reflect_color, g_reflectance); } } Output.RGBColor.a = 1.0; // if (g_rendering_mode == RENDERING_MODE_SEARCH_STEPS) // return (PS_OUTPUT)(float(overall_search_steps) / (255 * 6)); if (g_rendering_mode == RENDERING_MODE_FINAL) return Output; return (PS_OUTPUT)0; } //-------------------------------------------------------------------------------------- // Displacement mapping pixel shader //-------------------------------------------------------------------------------------- PS_OUTPUT DisplacementMapping_PS(TRANSFORM_VS_OUTPUT In) { PS_OUTPUT Output; Output.RGBColor.rgb = In.WorldPos; Output.RGBColor.a = 1.0; return Output; } //-------------------------------------------------------------------------------------- // Techniques //-------------------------------------------------------------------------------------- technique Flat { pass P0 { VertexShader = compile vs_2_0 Transform_Reflect_VS(); PixelShader = compile ps_2_0 Flat_PS(); } } technique NormalMapping { pass P0 { VertexShader = compile vs_3_0 Transform_VS(); PixelShader = compile ps_3_0 NormalMapping_PS(); } } technique ParallaxMapping_1 { pass P0 { VertexShader = compile vs_3_0 Transform_VS(); PixelShader = compile ps_3_0 ParallaxMapping_1_PS(); } } technique ParallaxMapping_2 { pass P0 { VertexShader = compile vs_3_0 Transform_VS(); PixelShader = compile ps_3_0 ParallaxMapping_2_PS(); } } technique ParallaxOcclusionMapping { pass P0 { VertexShader = compile vs_3_0 Transform_VS(); PixelShader = compile ps_3_0 ParallaxOcclusionMapping_PS(); } } technique DisplacementMapping { pass P0 { VertexShader = compile vs_3_0 DisplacementMapping_VS(); PixelShader = compile ps_3_0 DisplacementMapping_PS(); } } LocalRayTracing.fx //-------------------------------------------------------------------------------------- // File: LocalRayTracing.fx //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- // Includes //-------------------------------------------------------------------------------------- #include "shared.fxh" //-------------------------------------------------------------------------------------- // Global variables |
Реферат: Коваленко А. Е. Разработка системы научной визуализации.... Коваленко А. Е. Разработка системы научной визуализации. Квалификационная работа на степень магистра наук по направлению «Математика.... | Реферат Флягина Т. А. Проблемы разработки многооконных интерфейсов,... Флягина Т. А. Проблемы разработки многооконных интерфейсов, квалификационная работа на степень бакалавра наук | ||
Квалификационной работы на факультете математики и компьютерных наук В соответствии с действующими государственными образовательными стандартами выпускная квалификационная работа по специальности «Математика»... | Диссертация на степень магистра наук по направлению «Математика, компьютерные науки» Федеральное государственное автономное образовательное учреждение высшего профессионального образования | ||
Дипломная работа по направлению Математика. Прикладная математика студента гр. Мт 505 Федеральное государственное автономное образовательное учреждение высшего профессионального образования | Программа дисциплины Современные методы принятия решений для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 010400.... | ||
Программа дисциплины «Герменевтика» для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, и студентов направления подготовки 010400. 68 "Прикладная... | 1 Нормативные документы для разработки ооп впо по направлению подготовки... Общая характеристика вузовской основной образовательной программы высшего профессионального образования по направлению подготовки... | ||
Реферат Тычинин И. А. Разработка приложения для портативных устройств... Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра... | Основная образовательная программа (ооп) бакалавриата, реализуемая... Нормативные документы для разработки ооп бакалавриата по направлению подготовки «Прикладная математика и информатика» | ||
Программа дисциплины Архитектура ЭВМ для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направлений подготовки 010400.... | Образовательная программа высшего образования, реализуемая университетом... ... | ||
Литература Уросов А. П. Разработка методик визуализации для представления работы параллельных программ, квалификационная работа на степень бакалавра... | ЕН. Ф. 1 Математика и информатика: математика Учебная дисциплина Математика и информатика: "Математика" введена в процесс обучения для бакалавров по направлению подготовки "Художественное... | ||
Программа дисциплины «Модели корпусной лингвистики» для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления 010400. 68 "Прикладная... | Программа дисциплины «История» для направления 231300. 62 и 230700.... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 231300.... |