Для академического проекта я пытаюсь написать код для рисования рекламных щитов с нуля; теперь я собираюсь сделать их полупрозрачными. Я сумел сделать их хорошо выглядеть на фоне, но они все еще могут прикрывать друг друга с их должно-быть прозрачными углами, как на этой картинке:Прозрачные объекты, покрывающие друг друга
Я не уверен, что я я делаю неправильно. Это файл эффекта, который я использую для рисования рекламных щитов. Я пропустил части, связанные с вершинным шейдером, которые, как я думаю, сейчас неактуальны.
//cut
texture Texture;
texture MaskTexture;
sampler Sampler = sampler_state
{
Texture = (Texture);
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
sampler MaskSampler = sampler_state
{
Texture = (MaskTexture);
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
//cut
struct VertexShaderOutput
{
float4 Position : POSITION0;
float4 Color : COLOR;
float2 TexCoord : TEXCOORD0;
};
//cut
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float4 result = tex2D(Sampler, input.TexCoord) * input.Color;
float4 mask = tex2D(MaskSampler, input.TexCoord);
float alpha = mask.r;
result.rgb *= alpha;
result.a = alpha;
return result;
}
technique Technique1
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
}
}
У меня есть две текстуры, названные текстуры и MaskTexture, причем последние в оттенках серого. Биллборды, скорее всего, находятся в одном и том же буфере вершин и нарисованы с одним вызовом GraphicsDevice.DrawIndexedPrimitives()
от XNA.
У меня такое чувство, что я не делаю все правильно.
Вы включили GL_BLEND? Посмотрите раздел GL_BLEND здесь http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml – Ani
@ananthonline Извините, я скрыл информацию о том, что проект находится в XNA, а не в OpenGL, где-то на конец сообщения. Ну, на самом деле, единственное, что я сделал (или, по крайней мере, помню), чтобы включить смешение, - это добавить 'AlphaBlendEnable = true;' в блок 'pass'. Разве этого недостаточно? – kamilk
Я не вижу ничего плохого в вашем HLSL, попробуйте изменить пиксельные шейдеры, чтобы просто вернуть значение, полученное из вашей текстуры маски, чтобы убедиться, что оно используется так, как вы планировали. Также, каков ваш формат backbuffer? – Andy