Название: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Sqwer от 01 Июля 2009, 18:46:02 Странная вещь:
Когда оъекты находятся позади камеры Квест всё равно обрабатывает его геометрию. Из этой проблемы есть выход - frustrum culling, замечательно работающий с обычными материалами. Если не путаю, фрустум каллинг - технология при которой рендятся только объекты, которые попадают в конус видимости камеры. Проверка на видимость осуществляется нахождением баундиг бокса (фрэймом, ограничивающим боксом) в конусе камеры. Дла стандартных материалов Квест считает боундинг бокс на ура. Для шейдерных всё обстоит сложнее, боиндиг бокс не считается. он уходит в пивот и имеет вид математической точки с бесконечномалым размером. (оно и не мудрено: данные о геометрии объекта сразу передаются на GPU ). При включении фрустума наблюдается такой эффект, HLSL объект не отображается, если взгляд не затрагивает пивот(центр) объекта. что проэлюстрированно на скриншотах ниже Название: Re: [Графика]Проблема с отображением HLSL объектов Отправлено: Sqwer от 02 Июля 2009, 18:32:26 Проблема решена:
Надо действовать по следующему алгоритму: 1. Подключить данные сетки к каналу "поверхность" 2. Просчитать боундинг бокс 3. Включить фрустум 4. Жми "ОК" 5. Подключить данные сетки к каналу "поверхность" через HLSL Всё, готово, теперь когда шейдерный объект вне поля видимости камеры, он не рендится. Название: Re: [Графика]Проблема с отображением HLSL объектов(есть ответ) Отправлено: Sqwer от 02 Июля 2009, 19:37:19 Метод проверен на .exe с использованием NVIDIA PerfHUD 6.
Версия Квеста - 4.2.2 Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Cludz от 20 Апреля 2011, 00:06:40 а ты не пробовал подключать еще 1 сурфейс с геометрией для проверки и хайдить его?
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Sqwer от 20 Апреля 2011, 00:33:52 некропостер.
это было давно... сейчас даже не актуально. Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Ruslan от 20 Апреля 2011, 01:12:47 у нас сейчас свой канал deferred Render
- фрустум куллинг - лодирование - система иерархии (если объект переместил или повернул, то вместе с объектом перемещяются\поворачиваются все прилинкованные к нему объекты) - слои - постэфекты (SSAO и т.п.) - динамичное небо и солнце - ambient освещение от окружения Свой экспортер с поддержкой: - инстанс мешей - инстанс шейдеров (нормал, спекуляр, паралакс, кубмаповые отражения, прозрачка все это отображается во вьюпорте макса) - инстанс текстур - настройка и создание лодов (объекты лодируются прям во вьюпорте макса) сцена превышала миллион тринглов, фпс на моей тачке был выше 200 есть мысли DX10 прикрутить :P Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: vs от 03 Августа 2011, 12:17:15 Подскажите как прикрепить шейдер ??? У меня импортированная геометрия. Когда подсоединяю как во втором случае (см. картинку) геометрия не отображается. С примитивами этот шейдер работает нормально.
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Ruslan от 03 Августа 2011, 12:49:45 скрин не о чем не говорит, покажи сам код шейдера.
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: vs от 03 Августа 2011, 14:05:44 /*** Generated through Lumonix shaderFX by: Vladimir in 3dsmax at: 03.08.2011 1:04:38 ***/ // This FX shader was built to support the Quest3D engine. // Tell the app that we want tangets int UseTangent : UseTangent; int UseBiNormal : UseBiNormal; texture TextureMap_3177 : TEXTURE0 < string ResourceType = "2D"; >; sampler2D TextureMap_3177Sampler = sampler_state { Texture = <TextureMap_3177>; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; float spec :CHANNELVALUE0 < string UIWidget = "Slider"; float UIMin = 0.0; float UIMax = 255.0; float UIStep = 0.1; string UIName = "spec"; > = 0.2; float gloss :CHANNELVALUE1 < string UIWidget = "Slider"; float UIMin = 0.0; float UIMax = 255.0; float UIStep = 0.1; string UIName = "gloss"; > = 10.0; texture BumpMap_4244 : TEXTURE1 < string ResourceType = "2D"; >; sampler2D BumpMap_4244Sampler = sampler_state { Texture = <BumpMap_4244>; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; // this function does the different types of light attenuation float attenuation_func(int lightattenType, float4 lightAttenuation, float3 lightVec) { float att = 1.0; return att; } // this function does the different types of cone angle float coneangle_func(int lightconeType, float lightHotspot, float lightFalloff, float3 lightVec, float3 lightDir) { float cone = 1.0; return cone; } /************** light info **************/ #define MAX_LIGHTCOUNT 8 float NLIGHTS = 1; #define LIGHT_TYPE_NONE 0 #define LIGHT_TYPE_POINT 1 #define LIGHT_TYPE_SPOT 2 #define LIGHT_TYPE_DIRECTIONAL 3 float3 light_dir[MAX_LIGHTCOUNT] : LIGHTDIR; float3 light_pos[MAX_LIGHTCOUNT] : LIGHTPOS; float4 light_color[MAX_LIGHTCOUNT] : LIGHTCOLOR; float light_atten1[MAX_LIGHTCOUNT] : LIGHTATT1; float light_atten2[MAX_LIGHTCOUNT] : LIGHTATT2; float light_atten3[MAX_LIGHTCOUNT] : LIGHTATT3; float light_hotspot[MAX_LIGHTCOUNT] : LIGHTPHI; float light_falloff[MAX_LIGHTCOUNT] : LIGHTTHETA; float light_type[MAX_LIGHTCOUNT] : LIGHTTYPE; #define light1attenType 0 #define light1coneType 0 #define light1CastShadows false //---------------------------------- float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; float4x4 worldI : WorldInverse < string UIWidget = "None"; >; float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; float4x4 world : World < string UIWidget = "None"; >; // create the light vector float3 lightVec_func(float3 worldSpacePos, float3 lightVector, float3x3 objTangentXf, int lightType) { float3 lightVec = mul(objTangentXf, (mul((lightVector - worldSpacePos), worldI).xyz)); return lightVec; } // input from application struct a2v { float4 position : POSITION; float4 tangent : TANGENT; float4 binormal : BINORMAL; float4 normal : NORMAL; float2 texCoord : TEXCOORD0; }; // output to fragment program struct v2f { float4 position : POSITION; float3 lightVec : TEXCOORD0; float3 eyeVec : TEXCOORD1; float2 texCoord : TEXCOORD2; }; //Diffuse and Specular Pass Vertex Shader v2f v(a2v In, uniform float3 lightPos, uniform int lightType, uniform float3 lightDir) { v2f Out = (v2f)0; float3x3 objTangentXf; //build object to tangent space transform matrix objTangentXf[0] = In.tangent.xyz; objTangentXf[1] = -In.binormal.xyz; objTangentXf[2] = In.normal.xyz; float3 worldSpacePos = mul(In.position, world).xyz; //world space position Out.lightVec = lightVec_func(worldSpacePos, lightPos, objTangentXf, lightType); float4 osIPos = mul(viewInv[3], worldI); //put world space eye position in object space float3 osIVec = osIPos.xyz - In.position.xyz; //object space eye vector Out.eyeVec = mul(objTangentXf, osIVec); //tangent space eye vector passed out Out.position = mul(In.position, wvp); //transform vert position to homogeneous clip space Out.texCoord = In.texCoord; //pass through texture coordinates from channel 1 return Out; } //Diffuse and Specular Pass Pixel Shader float4 f(v2f In, uniform float3 lightDir, uniform float4 lightColor, uniform float4 lightAttenuation, uniform float lightHotspot, uniform float lightFalloff, uniform int lightType, uniform int lightattenType, uniform int lightconeType, uniform bool lightCastShadows, uniform int shadowPassCount) : COLOR { float3 ret = float3(0,0,0); float3 V = normalize(In.eyeVec); //creating the eye vector float3 L = normalize(In.lightVec); //creating the light vector float4 TextureMap_3177 = tex2D(TextureMap_3177Sampler, In.texCoord.xy); float3 input2 = TextureMap_3177.rgb; float input4 = spec; float input5 = gloss; float BumpMap_4244_center = tex2D(BumpMap_4244Sampler, In.texCoord.xy).r; //center bump map sample float BumpMap_4244_U = tex2D(BumpMap_4244Sampler, In.texCoord.xy + float2( 0.005, 0)).r; //U bump map sample float BumpMap_4244_V = tex2D(BumpMap_4244Sampler, In.texCoord.xy + float2(0, 0.005)).r; //V bump map sample float BumpMap_4244_dHdU = BumpMap_4244_U - BumpMap_4244_center; //create bump map U offset float BumpMap_4244_dHdV = BumpMap_4244_V - BumpMap_4244_center; //create bump map V offset float3 BumpMap_4244 = float3( -BumpMap_4244_dHdU, BumpMap_4244_dHdV, 0.05 ); //create the tangent space normal BumpMap_4244 = normalize(BumpMap_4244); //normalize the result float3 input8 = BumpMap_4244; float3 N = input8; //using the Normal socket float3 diffuseColor = input2; //using the Diffuse Color socket float NdotL = dot(N, L); //calculate the diffuse float diffuse = saturate(NdotL); //clamp to zero diffuseColor *= diffuse; //the resulting diffuse color float specularColor = input4; //the Specular Color socket was empty - using Specular Level instead float glossiness = input5; //using the Glossiness socket float3 R = -reflect(L, N); //Compute the reflection vector float RdotV = saturate(dot(R,V)); //Compute RdotV specularColor *= pow(RdotV, glossiness);//Raise to glossiness power and compute final specular color ret += specularColor + diffuseColor; //add specular and diffuse color together ret *= lightColor; //multiply by the color of the light float attenuation = attenuation_func(lightattenType, lightAttenuation, In.lightVec); //calculate the light attenuation float coneangle = coneangle_func(lightconeType, lightHotspot, lightFalloff, In.lightVec, lightDir); //calculate the light's cone angle ret *= attenuation * coneangle; //multiply by the light decay float4 done = float4(ret, 1); //create the final ouput value return done; } technique Complete { pass light1 { VertexShader = compile vs_2_0 v(light_pos[0], light_type[0], light_dir[0]); ZEnable = true; CullMode = ccw; ShadeMode = Gouraud; ZWriteEnable = true; AlphaBlendEnable = false; SrcBlend = SrcAlpha; DestBlend = One; AlphaTestEnable = FALSE; PixelShader = compile ps_2_0 f(light_dir[0], light_color[0], float4(light_atten1[0], light_atten2[0], light_atten3[0], 1.0), light_hotspot[0], light_falloff[0], light_type[0], light1attenType, light1coneType, light1CastShadows, 1); } } Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Ruslan от 03 Августа 2011, 14:24:10 у меня этот шейдер работает
сам шейдер в канале HLSL скомпилировал? если да, то тогда ищи проблемы в экспорте.. вижу, что модель экспортировалась из майки, моя модель из макса Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: vs от 03 Августа 2011, 15:41:03 Можно глянуть что у тебя в окне каналов?
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Ruslan от 03 Августа 2011, 15:45:04 отакоэ
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: vs от 03 Августа 2011, 19:00:32 У меня инфа об объекте в ноде 3d Obgect Data, а судя по примерам должна быть Vertex Data. Пока ковыряю экспорт :-\
Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: Ruslan от 03 Августа 2011, 19:05:31 Vertex Data - это просто имя (можно обозвать хоть trulala)
а тип этого канала - 3d Obgect Data Название: Re: [G] Проблема с отображением HLSL объектов (есть ответ) Отправлено: vs от 03 Августа 2011, 20:22:14 Разобрался методом тыка. Надо было галки расставить при импорте.
|