FranklinRoosevelt Posted March 14, 2015 Share Posted March 14, 2015 (edited) Привет всем, я экспериментируя с шейдерами заметил их странную работу на скинах, вот к примеру, есть стандартный ресурс Texture names (ресурс который позволяет узнать название текстур) выделенная текстура должна мерцать разными цветами (rgb), но со скинами такого не происходит, они просто становятся серыми: Аналогично с шейдером который делает текстуру прозрачной, на все остальные текстуры он работает хорошо, а вот на педов нет, через скин видно только некоторые объекты, более глобальные, а всё остальное нет, в чём может быть ошибка? Как сделать чтобы шейдер адекватно работал и на скинах? Скрин 1 Скрин 2 UPDATE: Мне кажется что это из-за альфа канала. UPDATE 2: Альфа канал здесь не причём, потестил на разных скинах. Edited March 17, 2015 by Guest Link to comment
Kernell Posted March 15, 2015 Share Posted March 15, 2015 Без кода сказать что либо не возможно. Есть предположение, что проблема в z-буффере Link to comment
FranklinRoosevelt Posted March 15, 2015 Author Share Posted March 15, 2015 Вот код прозрачного шейдера. Код самого шейдера: struct PSInput { float4 Diffuse : COLOR0; }; float4 PixelShaderFunction( PSInput PS ) : COLOR0 { float4 color = PS.Diffuse; color.a = 0; return color; } technique { pass p0 { AlphaBlendEnable = TRUE; DestBlend = INVSRCALPHA; SrcBlend = SRCALPHA; PixelShader = compile ps_2_0 PixelShaderFunction(); } } Скрипт шейдера: addEventHandler( "onClientResourceStart", resourceRoot, function() local myShader, tec = dxCreateShader ( "transparency.fx", 1, 0, false, "all" ) if myShader then engineApplyShaderToWorldTexture ( myShader, 'omokung' ) -- omokung - текстура скина которые на скринах else outputChatBox('Error with create shader') end end ) Мета: <meta> <script src="shader.lua" type="client" /> <file src="transparency.fx" type="client" /> </meta> Есть предположение, что проблема в z-буффере Возможно исправить? Link to comment
Kernell Posted March 18, 2015 Share Posted March 18, 2015 Извиняюсь за долгий ответ, немного занят был. В общем поковырял код, и такое чувство что в пиксельный шейдер не приходит информация о Diffuse цвете. Поэтому как вариант создать эту информацию самому, благо мы имеем текстуру модели и её UV координаты. Под структурой PSInput объяви сэмплер с текустурой gTexture0 (в данном случае это будет omokung). sampler2D ColorSampler = sampler_state { Texture = <gTexture0>; }; далее замени это: float4 color = PS.Diffuse; на это: float4 color = tex2D( ColorSampler, PS.TexCoord ); Конечно же после таких действий моделька будет без теней и прочего. С помощью вершинного шейдера и функции MTACalcGTABuildingDiffuse (из mta-helper) по аналогии как тут можно высчитать нужные цвета теней для PS.Diffuse (что кстати было бы более правильным решением, чем то которое я привёл выше) По поводу прозрачности пока не разобрался почему так происходит, альфа наложение включено, но работает либо не правильно, либо мы чего-то не знаем. Link to comment
FranklinRoosevelt Posted March 18, 2015 Author Share Posted March 18, 2015 Kernell, спасибо, как всегда выручаешь, по поводу прозрачности буду написать в англ. язычку ветку, мб там кто-то найдет ответ. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now