2012-06-13 2 views
0

학술 프로젝트의 경우 게시판을 처음부터 그리기위한 코드를 작성하려고합니다. 이제 나는 그들을 반투명하게 만들었다. 나는 그들이 배경에 대해 잘 보이게하기 위해 관리했습니다하지만 그들은 여전히이 그림처럼, 자신의-해야 투명 모서리가 서로를 커버 할 수있다 : 나는 '모르겠어요서로 덮는 투명한 오브젝트

잘못하고있다. 이 광고판을 그릴 때 사용하는 효과 파일입니다. 버텍스 쉐이더와 관련된 부분은 생략했는데, 지금은 부적절하다고 생각합니다. 텍스처와 MaskTexture 이름

나는 두 개의 텍스처를 가지고
//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; 
    } 
} 

, 그레이 스케일에서 후자. 게시판은 대부분 같은 정점 버퍼에 있으며 XNA에서 GraphicsDevice.DrawIndexedPrimitives()이라는 단일 호출로 그려집니다.

나는 모든 일을 제대로하지 못하고 있다고 생각합니다.

+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에 잘못된 것이 실제로 보이지 않을 것입니다. 픽셀 쉐이더를 변경하여 마스크 텍스처에서 가져온 값을 반환하여 의도 한대로 사용하고 있는지 확인하십시오. 또한 백 버퍼 형식이 무엇입니까? – Andy

답변

0

해결책을 찾았습니다. 셰이더는 괜찮습니다. 문제는 XNA 코드에있는 것으로 밝혀 졌으므로 잘못된 점에주의를 기울여서 죄송합니다.

이 솔루션은 게시판을 그리기 전에 깊이 스텐실 버퍼를 (그것이 무엇이든)을 활성화하는 것입니다

device.DepthStencilState = DepthStencilState.DepthRead; 

그것은 나중에 비활성화 할 수 있습니다 :

device.DepthStencilState = DepthStencilState.Default; 
0

순서대로 그려야합니다. 가장 먼 곳에서 가장 가까운 곳으로.