Jump to content

Вопрос по шейдерам.


Recommended Posts

Привет всем, я экспериментируя с шейдерами заметил их странную работу на скинах, вот к примеру, есть стандартный ресурс Texture names (ресурс который позволяет узнать название текстур) выделенная текстура должна мерцать разными цветами (rgb), но со скинами такого не происходит, они просто становятся серыми:

f80acedea426c91e570dedae211cd420.png

Аналогично с шейдером который делает текстуру прозрачной, на все остальные текстуры он работает хорошо, а вот на педов нет, через скин видно только некоторые объекты, более глобальные, а всё остальное нет, в чём может быть ошибка?

Как сделать чтобы шейдер адекватно работал и на скинах?

Скрин 1 Скрин 2

44c0a76c20ab32da8e9c256a3c9026f2.pngc20eb48cf9c928b2e6859a645470e42e.png

UPDATE: Мне кажется что это из-за альфа канала.

UPDATE 2: Альфа канал здесь не причём, потестил на разных скинах.

Edited by Guest
Link to comment

Вот код прозрачного шейдера.

Код самого шейдера:

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

Извиняюсь за долгий ответ, немного занят был.

В общем поковырял код, и такое чувство что в пиксельный шейдер не приходит информация о 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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...