2012-08-30 3 views
0

shaders에 기반한 조명 시스템을 만들고 싶습니다 .http : //stackoverflow.com/editing-help 이를 위해 텍스처에 특정 기능을 적용해야합니다. C#/XNA의 셰이더 알고리즘을 통해 텍스처를 전달하는 방법은 무엇입니까? 나는 이것을 시도했다 :Texture에서 shader를 사용하는 방법?

foreach (EffectPass pass in effect.Techniques[0].Passes) 
      { 
       pass.Apply(); 
      } 
spriteBatch.Draw(shadowmap, 
       new Rectangle(0, 0, range * 2, range * 2), 
       new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range), 
       Color.White); 

그러나 그것은 작동하지 않는다. 나는 또한 이것을 시도했다 :

spriteBatch.Begin(); 

      spriteBatch.Draw(shadowmap, 
       new Rectangle(0, 0, range * 2, range * 2), 
       new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range), 
       Color.White); 
      spriteBatch.End(); 
      graphicsDevice.SetRenderTarget(null); 
      effect.Parameters["tex"].SetValue(area); 
      foreach (EffectPass pass in effect.Techniques[0].Passes) 
      { 
       pass.Apply(); 
      } 

그러나 이것도 아무것도하지 않는다. 2/3 알고리즘 패스를 통해 텍스처를 전달해야하므로 텍스처에 임의로 쉐이더를 적용 할 방법이 필요합니다.이 방법이 있습니까?

편집 :

texture tex; 
sampler input : tex; 
float red; 
float2 mousepos; 
float4 PixelShaderFunction(float2 coords: TEXCOORD0) : COLOR0 
{ 
    float4 color; 
    color=tex2D(input,coords.xy); 
    color.r=0.9; 
    return color; 
} 



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

} 
+0

틀린 링크를 게시했습니다. 게시물을 편집하거나 댓글로 추가 할 수 있습니까? –

답변

0

당신은 Effectthis overload of SpriteBatch.Begin에 전달할 수 있습니다 : HLSL 코드는 다음입니다.

SpriteBatch.Draw을 호출하기 전에 SpriteSortMode.Immediate을 사용한 다음 Apply() 다른 효과를 사용할 수도 있습니다.

는 (다른 모든 모드에서 SpriteBatch 것이다 배치까지 모든 작업 - 효과와 그림을 설정 -. 당신이 End를 호출 할 때까지이 더 나은 성능을 제공하지만, 당신에게 새로운 효과를 설정 할 수있는 기회를 제공하지 않거나 스프라이트 사이에 상태.)


당신은 사람 (당신과 같이 그래픽 장치에 텍스처를 설정할 수 있습니다) SpriteBatch를 통해 직접 효과를 사용하는 경우 또한

GraphicsDevice.Texture[0] = myTexture; 

Apply() 전자를 다른 그래픽 장치 상태를 설정하고 GraphicsDevice.Draw*() 메서드 중 하나를 호출하면됩니다.


foreach 루프의 오류에 유의하십시오. Apply()을 호출 할 때마다 무언가를 그려야합니다 (즉, 루프 내에서). SpriteBatch.Begin에 효과를 전달하면 루프가 필요하지 않습니다. SpriteBatch은 내부적으로 처리합니다.

+0

당신의 솔루션을 시도했지만 여전히 작동하지 않습니다. 렌더링 타겟이므로 텍스쳐로 설정할 수 없습니다. 내가해야 할 일은 기본적으로 텍스처를 취하여 변환하는 것입니다. 두 개의 알고리즘을 실행해야만 그 결과를 그릴 수 있습니다. 두 개의 RenderTargets를 사용하고 하나에서 다른쪽으로 출력을 핑퐁 할 것입니다. – Taikand

+0

'RenderTarget2D'는'Texture2D'입니다. 당신은 그런 식으로 사용할 수 있습니다. 단 한가지 단서는 텍스처를 렌더링 대상으로 설정하는 동안 텍스처로 사용할 수 없다는 것입니다. 텍스쳐로 사용하기 전에'SetRenderTarget (null)'을 사용하십시오. 이미이 작업을하고있는 것처럼 보입니다. 멀티 패스 효과를 위해 여러 타겟을 사용하는 것이 올바른 해결책입니다. –