Jump to content

Как сделать текстуру прозрачную? [Шейдеры]


Recommended Posts

Всем привет. Я пытался сделать шейдер чтобы стандартные текстуры можно было сделать прозрачными, возможно ли это? Скрин, мне кажется что да.

Взял я ресурс Texture_names и решил попробовать по экспериментировать с альфой, шейдер:

float4 GetColor() 
{ 
    return float4(0, 0, 0, 0); 
} 
  
technique tec0 
{ 
    pass P0 
    { 
        MaterialAmbient = GetColor(); 
        MaterialDiffuse = GetColor(); 
        MaterialEmissive = GetColor(); 
        MaterialSpecular = GetColor(); 
  
        AmbientMaterialSource = Material; 
        DiffuseMaterialSource = Material; 
        EmissiveMaterialSource = Material; 
        SpecularMaterialSource = Material; 
  
        ColorOp[0] = SELECTARG1; 
        ColorArg1[0] = Diffuse; 
  
        AlphaOp[0] = SELECTARG1; 
        AlphaArg1[0] = Diffuse; 
  
        Lighting = true; 
    } 
} 
  

Сразу говорю что с HLSL не особо знаком, но Си знаю немного. Я не понимаю откуда берётся значение переменой Material в данном случае и куда уходит всё это, буду рад если хоть чуть объясните.

Потом ещё поюзал Ped_shell т.к. увидел что там какая-то прозрачность есть, но все же там просто изменяется альфа с 0 до < 1 через dxSetShaderValue, так же как и делал я.

Тут я все это юзая замечаю что некоторые текстуры отличаются друг от друга, при GetColor(1, 0, 0, 0.1) например тень пропадала, сам пед становился прозрачным, ещё пол в интерьере тоже пропадал:

dfc728d52df5.png

52dd1b01cc65.png

А остальные объекты просто становились красными и всё:

687c041d2857.png

Жду помощи.

Link to comment

Для работы с цветом используйте пиксельный шейдер

struct PSInput 
{ 
    float4 Diffuse      : COLOR0; 
}; 
  
float4 PixelShaderFunction( PSInput PS ) : COLOR0 
{ 
    float4 color = PS.Diffuse; 
     
    color.a = 0.5; 
     
    return color; 
} 
  
technique 
{ 
    pass p0 
    { 
        PixelShader     = compile ps_2_0 PixelShaderFunction(); 
    } 
} 
  

Link to comment
Тебе нужно сделать текстуру прозрачной или просто сделать невидимой?

Прозрачной вроде как. Это не одно и тоже? Ну чтобы там где она была было видно следующую текстуру.

Нет, это не одно и тоже. Прозрачность может быть разной, т.е. быть полупрозрачной. Что и делает шейдер выше. Правда я забыл добавить альфа-смешивание.

Вот исправленная версия:

float transparency = 0.5; // Это уровень прозрачности. Можешь задавать это значение через dxSetShaderValue 
  
struct PSInput 
{ 
    float4 Diffuse      : COLOR0; 
}; 
  
float4 PixelShaderFunction( PSInput PS ) : COLOR0 
{ 
    float4 color = PS.Diffuse; 
    
    color.a = transparency; 
    
    return color; 
} 
  
technique transparency 
{ 
    pass p0 
    { 
        AlphaBlendEnable    = TRUE; 
        DestBlend           = INVSRCALPHA; 
        SrcBlend            = SRCALPHA; 
         
        PixelShader         = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

Link to comment
Нет, это не одно и тоже. Прозрачность может быть разной, т.е. быть полупрозрачной. Что и делает шейдер выше. Правда я забыл добавить альфа-смешивание.

Вот исправленная версия:

float transparency = 0.5; // Это уровень прозрачности. Можешь задавать это значение через dxSetShaderValue 
  
struct PSInput 
{ 
    float4 Diffuse      : COLOR0; 
}; 
  
float4 PixelShaderFunction( PSInput PS ) : COLOR0 
{ 
    float4 color = PS.Diffuse; 
    
    color.a = transparency; 
    
    return color; 
} 
  
technique transparency 
{ 
    pass p0 
    { 
        AlphaBlendEnable    = TRUE; 
        DestBlend           = INVSRCALPHA; 
        SrcBlend            = SRCALPHA; 
         
        PixelShader         = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

Спасибо огромное, сейчас испробую, но мне уже помогли в англ. ветке, в стандартном ресурсе [gameplay]\visualiser просто изменить альфу.

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...