Скачать 0.59 Mb.
|
//-------------------------------------------------------------------------------------- // File: SurfaceDetailVariations.fx //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- // Includes //-------------------------------------------------------------------------------------- #include "defines.fxh" #include "shared.fxh" //-------------------------------------------------------------------------------------- // Global variables //-------------------------------------------------------------------------------------- static const float3 g_MaterialAmbientColor = { 0.2, 0.2, 0.2 }; // Material's ambient color static const float3 g_MaterialDiffuseColor = { 0.5, 0.5, 0.5 }; // Material's diffuse color static const float3 g_MaterialSpecularColor = { 0.7, 0.7, 0.7 }; // Material's specular color static const float3 g_Normal = { 0.0, 0.0, -1.0 }; // Quad's normal in object space static const float g_Shine = 128; float g_height_delta_scale; float g_max_height; float g_grad_threshold; float g_max_raytrace_bias; float g_linear_search_delta; int g_binary_search_steps; float g_reflectance; bool g_reflections; bool g_cast_shadows; float g_tex_scale; // Simple transform in tangent space float3 g_Eye; // Eye position in world space float3 g_WorldLightDir; // Normalized light's direction in world space float4 g_LightDiffuse; // Light's diffuse color float2 g_normal_height_map_res; // Resolution of normal height map int g_rendering_mode; // Renderein mode (normal, final) int g_height_diff_samples; // Technique (number of samples) of height map differentiation int g_grad_method; // Gradients evaluation method texture2D g_ColorTexture; // Color texture for object texture2D g_NormalHeightTexture; // Normal & height texture for object float4x4 g_mWorld; // World matrix for object //-------------------------------------------------------------------------------------- // Texture samplers //-------------------------------------------------------------------------------------- sampler2D ColorTextureSampler = sampler_state { Texture = MipFilter = LINEAR; MinFilter = ANISOTROPIC; MagFilter = LINEAR; MaxAnisotropy = 16; AddressU = MIRROR; AddressV = MIRROR; }; sampler2D NormalHeightTextureSampler = sampler_state { Texture = MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; MaxAnisotropy = 16; AddressU = MIRROR; AddressV = MIRROR; }; //-------------------------------------------------------------------------------------- // Vertex shaders output structures //-------------------------------------------------------------------------------------- struct TRANSFORM_REFLECT_VS_OUTPUT { float4 Position : POSITION; // vertex position float2 TextureUV : TEXCOORD0; // vertex texture coords float3 WorldPos : TEXCOORD1; // vertex position in world space float3 Normal : TEXCOORD2; // vertex normal in world space float3 Reflect : TEXCOORD3; // vertex reflection direction in world space }; struct TRANSFORM_VS_OUTPUT { float4 Position : POSITION; // vertex position float2 TextureUV : TEXCOORD0; // vertex texture coords float3 WorldPos : TEXCOORD1; // vertex position in world space }; //-------------------------------------------------------------------------------------- // This shader computes standard transform along with world normal and reflection direction //-------------------------------------------------------------------------------------- TRANSFORM_REFLECT_VS_OUTPUT Transform_Reflect_VS(float3 vPos : POSITION, float2 vTexCoord0 : TEXCOORD0) { TRANSFORM_REFLECT_VS_OUTPUT Output; float4x4 g_mWorldViewProjection = mul(g_mWorld, g_mViewProjection); // Transform the position from object space to homogeneous projection space Output.Position = mul(float4(vPos, 1), g_mWorldViewProjection); // Just copy the texture coordinate through Output.TextureUV = vTexCoord0; // Transform the position from object space to world space Output.WorldPos = mul(float4(vPos, 1), g_mWorld); // Transform the normal from object space to world space Output.Normal = normalize(mul(g_Normal, (float3x3)g_mWorld)); // normal (world space) // Find reflection direction in world space float3 v = g_Eye - Output.WorldPos; Output.Reflect = reflect(-v, Output.Normal); return Output; } //-------------------------------------------------------------------------------------- // This shader computes standard transform //-------------------------------------------------------------------------------------- TRANSFORM_VS_OUTPUT Transform_VS(float3 vPos : POSITION, float2 vTexCoord0 : TEXCOORD0) { TRANSFORM_VS_OUTPUT Output; float4x4 g_mWorldViewProjection = mul(g_mWorld, g_mViewProjection); // Transform the position from object space to homogeneous projection space Output.Position = mul(float4(vPos, 1), g_mWorldViewProjection); // Just copy the texture coordinate through Output.TextureUV = vTexCoord0; // Transform the position from object space to world space Output.WorldPos = mul(float4(vPos, 1), g_mWorld); return Output; } //-------------------------------------------------------------------------------------- // Displacement mapping vertex shader //-------------------------------------------------------------------------------------- TRANSFORM_VS_OUTPUT DisplacementMapping_VS(float3 vPos : POSITION, float2 vTexCoord0 : TEXCOORD0) { TRANSFORM_VS_OUTPUT Output; float4x4 g_mWorldViewProjection = mul(g_mWorld, g_mViewProjection); // Transform the position from object space to homogeneous projection space Output.Position = mul(float4(vPos, 1), g_mWorldViewProjection); // Just copy the texture coordinate through Output.TextureUV = vTexCoord0; // Transform the position from object space to world space Output.WorldPos = mul(float4(vPos, 1), g_mWorld); return Output; } //-------------------------------------------------------------------------------------- // Pixel shader output structure //-------------------------------------------------------------------------------------- struct PS_OUTPUT { float4 RGBColor : COLOR0; // Pixel color }; //-------------------------------------------------------------------------------------- // These functions returns normal (possible unnormalized) in (+t +b -n) space //-------------------------------------------------------------------------------------- // Forward declarations float3 FetchNormal(uniform sampler2D NormalHeightSampler, in float2 uv); float3 FetchNormal(uniform sampler2D NormalHeightSampler, in float2 uv, in float2 dx, in float2 dy); float3 FetchNormal(uniform sampler2D NormalHeightSampler, in float2 uv) { return FetchNormal(NormalHeightSampler, uv, ddx(uv), ddy(uv)); } float3 FetchNormal(uniform sampler2D NormalHeightSampler, in float2 uv, in float2 dx, in float2 dy) { if(g_height_diff_samples == 0) { // fetch normal from normal map float3 n = tex2Dgrad(NormalHeightSampler, uv, dx, dy).xyz; // unpack [0..1]->[-1..1] n = n * 2.0 - 1.0; // reconstruct z n.z = sqrt(1 - dot(n.xy, n.xy)); return float3(n.x, -n.y, -n.z); } else { /*------------------------------------------------------------------------------ compute normal based on height map in normalized (+t +b +n) space U = u / g_tex_scale ( = 2u); dh/dU = 0.5 * dh/du V = v / g_tex_scale ( = 2v); dh/dV = 0.5 * dh/dv n = (dp/dU x dp/dV) - (dh/dU * dp/dU) - (dh/dV * dp/dV) (*) ------------------------------------------------------------------------------*/ // compute delta // const float tex_compress = max(length(dx * g_normal_height_map_res), length(dy * g_normal_height_map_res)); // const float2 delta = clamp((float2)tex_compress, 1, g_normal_height_map_res) / g_normal_height_map_res * g_height_delta_scale; const float2 delta = g_height_delta_scale / g_normal_height_map_res; float3 n; // ( * g_tex_scale) for d/du->d/dU, d/dv->d/dV // ( / -g_tex_scale) for unnormalized (+T +B -N) -> normalized (+t +b +n) space // (-) in formula (*) if (g_height_diff_samples == 3) { float height_centre = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y), dx, dy).w, height_x = tex2Dgrad(NormalHeightSampler, float2(uv.x + delta.x, uv.y), dx, dy).w, heitht_y = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y + delta.y), dx, dy).w; n.x = g_max_height * (height_x - height_centre) / delta; n.y = g_max_height * (heitht_y - height_centre) / delta; } else if (g_height_diff_samples == 4) { float height_px = tex2Dgrad(NormalHeightSampler, float2(uv.x + delta.x, uv.y), dx, dy).w, height_nx = tex2Dgrad(NormalHeightSampler, float2(uv.x - delta.x, uv.y), dx, dy).w, heitht_py = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y + delta.y), dx, dy).w, heitht_ny = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y - delta.y), dx, dy).w; n.x = g_max_height * (height_px - height_nx) / (delta.x * 2); n.y = g_max_height * (heitht_py - heitht_ny) / (delta.y * 2); } else // 8 samples { float height_nx_ny = tex2Dgrad(NormalHeightSampler, float2(uv.x - delta.x, uv.y - delta.y), dx, dy).w, height_0x_ny = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y - delta.y), dx, dy).w, height_px_ny = tex2Dgrad(NormalHeightSampler, float2(uv.x + delta.x, uv.y - delta.y), dx, dy).w, height_nx_0y = tex2Dgrad(NormalHeightSampler, float2(uv.x - delta.x, uv.y), dx, dy).w, height_px_0y = tex2Dgrad(NormalHeightSampler, float2(uv.x + delta.x, uv.y), dx, dy).w, height_nx_py = tex2Dgrad(NormalHeightSampler, float2(uv.x - delta.x, uv.y + delta.y), dx, dy).w, height_0x_py = tex2Dgrad(NormalHeightSampler, float2(uv.x, uv.y + delta.y), dx, dy).w, height_px_py = tex2Dgrad(NormalHeightSampler, float2(uv.x + delta.x, uv.y + delta.y), dx, dy).w; n.x = g_max_height * (height_px_ny - height_nx_ny + height_px_py - height_nx_py + 2 * (height_px_0y - height_nx_0y)) / (delta.x * 8); n.y = g_max_height * (height_nx_py - height_nx_ny + height_px_py - height_px_ny + 2 * (height_0x_py - height_0x_ny)) / (delta.y * 8); } n.z = 1; // return in (+t +b -n) space return float3(n.xy, -n.z); } }; //-------------------------------------------------------------------------------------- // This function compute Blinn-Phong lighting //-------------------------------------------------------------------------------------- float3 BlinnPhong(float3 TexColor, float3 n, float3 v, float3 l, float shadow = 1) { // return v * 0.5 + 0.5; float3 h = normalize(v + l); float3 color = g_MaterialDiffuseColor * TexColor * saturate(dot(l, n)); color += g_MaterialSpecularColor * pow(saturate(dot(h, n)), g_Shine); color *= g_LightDiffuse; color *= shadow; color += g_MaterialAmbientColor * TexColor; return color; } //-------------------------------------------------------------------------------------- // Flat pixel shader //-------------------------------------------------------------------------------------- PS_OUTPUT Flat_PS(TRANSFORM_REFLECT_VS_OUTPUT In) { PS_OUTPUT Output; // view and light directions float3 v = normalize(g_Eye - In.WorldPos); float3 l = normalize(g_WorldLightDir); float3 n = normalize(In.Normal); // Lookup texture float3 TexColor = tex2D(ColorTextureSampler, In.TextureUV).rgb; Output.RGBColor.rgb = BlinnPhong(TexColor, n, v, l); Output.RGBColor.a = 1.0; if (g_reflections) { // Lookup cube map float3 reflect_color = texCUBE(CubeMapSampler, In.Reflect); // Combine with previous color Output.RGBColor.rgb = lerp(Output.RGBColor.rgb, reflect_color, g_reflectance); } return Output; } //-------------------------------------------------------------------------------------- // Normal Mapping pixel shader //-------------------------------------------------------------------------------------- PS_OUTPUT NormalMapping_PS(TRANSFORM_VS_OUTPUT In) { PS_OUTPUT Output; // view and light directions float3 v = normalize(g_Eye - In.WorldPos); float3 l = g_WorldLightDir; // 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 1 pixel shader //-------------------------------------------------------------------------------------- PS_OUTPUT ParallaxMapping_1_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) * g_tex_scale; |
Реферат: Коваленко А. Е. Разработка системы научной визуализации.... Коваленко А. Е. Разработка системы научной визуализации. Квалификационная работа на степень магистра наук по направлению «Математика.... | Реферат Флягина Т. А. Проблемы разработки многооконных интерфейсов,... Флягина Т. А. Проблемы разработки многооконных интерфейсов, квалификационная работа на степень бакалавра наук | ||
Квалификационной работы на факультете математики и компьютерных наук В соответствии с действующими государственными образовательными стандартами выпускная квалификационная работа по специальности «Математика»... | Диссертация на степень магистра наук по направлению «Математика, компьютерные науки» Федеральное государственное автономное образовательное учреждение высшего профессионального образования | ||
Дипломная работа по направлению Математика. Прикладная математика студента гр. Мт 505 Федеральное государственное автономное образовательное учреждение высшего профессионального образования | Программа дисциплины Современные методы принятия решений для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 010400.... | ||
Программа дисциплины «Герменевтика» для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, и студентов направления подготовки 010400. 68 "Прикладная... | 1 Нормативные документы для разработки ооп впо по направлению подготовки... Общая характеристика вузовской основной образовательной программы высшего профессионального образования по направлению подготовки... | ||
Реферат Тычинин И. А. Разработка приложения для портативных устройств... Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра... | Основная образовательная программа (ооп) бакалавриата, реализуемая... Нормативные документы для разработки ооп бакалавриата по направлению подготовки «Прикладная математика и информатика» | ||
Программа дисциплины Архитектура ЭВМ для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направлений подготовки 010400.... | Образовательная программа высшего образования, реализуемая университетом... ... | ||
Литература Уросов А. П. Разработка методик визуализации для представления работы параллельных программ, квалификационная работа на степень бакалавра... | ЕН. Ф. 1 Математика и информатика: математика Учебная дисциплина Математика и информатика: "Математика" введена в процесс обучения для бакалавров по направлению подготовки "Художественное... | ||
Программа дисциплины «Модели корпусной лингвистики» для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления 010400. 68 "Прикладная... | Программа дисциплины «История» для направления 231300. 62 и 230700.... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 231300.... |