2012-06-13 9 views
0

Для академического проекта я пытаюсь написать код для рисования рекламных щитов с нуля; теперь я собираюсь сделать их полупрозрачными. Я сумел сделать их хорошо выглядеть на фоне, но они все еще могут прикрывать друг друга с их должно-быть прозрачными углами, как на этой картинке:Прозрачные объекты, покрывающие друг друга

Я не уверен, что я я делаю неправильно. Это файл эффекта, который я использую для рисования рекламных щитов. Я пропустил части, связанные с вершинным шейдером, которые, как я думаю, сейчас неактуальны.

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

У меня такое чувство, что я не делаю все правильно.

+0

Вы включили GL_BLEND? Посмотрите раздел GL_BLEND здесь http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml – Ani

+0

@ananthonline Извините, я скрыл информацию о том, что проект находится в XNA, а не в OpenGL, где-то на конец сообщения. Ну, на самом деле, единственное, что я сделал (или, по крайней мере, помню), чтобы включить смешение, - это добавить 'AlphaBlendEnable = true;' в блок 'pass'. Разве этого недостаточно? – kamilk

+0

Я не вижу ничего плохого в вашем HLSL, попробуйте изменить пиксельные шейдеры, чтобы просто вернуть значение, полученное из вашей текстуры маски, чтобы убедиться, что оно используется так, как вы планировали. Также, каков ваш формат backbuffer? – Andy

ответ

0

Я нашел решение. Шейдеры в порядке, проблема оказалась в коде XNA, поэтому извините за привлечение внимания к неправильной вещи.

Решение заключается в обеспечении глубины буфера трафарета (все, что есть) перед нанесением рекламных щитов:

device.DepthStencilState = DepthStencilState.DepthRead; 

Это может быть отключена после:

device.DepthStencilState = DepthStencilState.Default; 
0

Вы должны нарисовать их на заказ. От самого дальнего до ближайшего.

Смежные вопросы