2014-06-14 4 views
0

XNA에서 진행률 표시 줄을 그리기위한 간단한 쉐이더를 만듭니다.XNA의 진행 막대 쉐이더 관련 문제

아이디어는 간단합니다. 두 개의 텍스처와 값이 있으며, X 텍스처 좌표가 작 으면 전경 텍스처의 픽셀을 사용하고 그렇지 않으면 배경 텍스처를 사용하십시오.

/* Variables */ 

texture BackgroundTexture; 
sampler2D BackgroundSampler = sampler_state 
{ 
    Texture = (BackgroundTexture); 
    MagFilter = Point; 
    MinFilter = Point; 
    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

texture ForegroundTexture; 
sampler2D ForegroundSampler = sampler_state 
{ 
    Texture = (ForegroundTexture); 
    MagFilter = Point; 
    MinFilter = Point; 
    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

float Value; 

/* Pixel shaders */ 

float4 PixelShader1(float4 pTexCoord : texcoord0) : color0 
{ 
    float4 texColor = 
     pTexCoord.x <= Value ? 
     tex2D(ForegroundSampler, pTexCoord) : 
     tex2D(BackgroundSampler, pTexCoord); 

    return texColor; 
} 

/* Techniques */ 

technique Technique1 
{ 
    pass Pass1 
    { 
     PixelShader = compile ps_2_0 PixelShader1(); 
    } 
} 

그러나 ForegroundTexture 만 수정하십시오. BackgroundSampler는 단순히 흰색입니다. 마침내 쉐이더에서 선언 된 텍스처 만 정확하다는 것을 알게되었습니다.

이유를 이해하는 데 도움주세요.

+0

게시물에 대한 답변은 게시물에 포함되어서는 안됩니다. 답변을 아래에 게시하십시오. :) – Jwosty

+0

죄송합니다, 저는 여기 뉴비입니다. –

답변

2

나는 그것을 얻었습니다!

쉐이더에는 문제가 없습니다.

실수는 heare이었다

this.progressBarEffect.Parameters["Value"].SetValue(progressBarValue); 
      this.progressBarEffect.Parameters["ForegroundTexture"].SetValue(this.progressBarForegroundTexture); 
      this.progressBarEffect.Parameters["BackgroundTexture"].SetValue(this.progressBarBackgroundTexture); 
      this.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointWrap, null, null, this.progressBarEffect); 
      this.spriteBatch.Draw(this.pixelTexture, new Rectangle(5, 200, 180, 30), Color.White); 
      this.spriteBatch.End(); 

그리고 올바른 변형이다 : 나는 첫 번째 방법을 그리기에 전달 질감 텍스처 사용 같은 인덱스를 선언 한 것을 잊었습니다

this.progressBarEffect.Parameters["Value"].SetValue(progressBarValue); 
      //this.progressBarEffect.Parameters["ForegroundTexture"].SetValue(this.progressBarForegroundTexture); 
      this.progressBarEffect.Parameters["BackgroundTexture"].SetValue(this.progressBarBackgroundTexture); 
      this.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointWrap, null, null, this.progressBarEffect); 
      this.spriteBatch.Draw(this.progressBarForegroundTexture, new Rectangle(5, 200, 180, 30), Color.White); 
      this.spriteBatch.End(); 

.

아마도 누군가에게 유용 할 것입니다.