2010-08-13 4 views
2

Silverlight에서 게임 관련 렌더링을 일부 수행하고 있습니다. 회전하는 이미지에 픽셀 쉐이더를 첨부하면 볼 수 있습니다. 이상한, 퍼지, pixelation 효과.회전 변환을 사용하는 픽셀 쉐이더를 사용할 때 Silverlight에서 픽셀/필터링 문제 발생

다음은 문제의 스크린 샷입니다. 왼쪽의 이미지는 변형 된 것입니다. 오른쪽 이미지에는 변형과 픽셀 쉐이더가 있습니다.

http://andrewrussell.net/offsite/2010/stack-sites/cat-girl-pixels.png

당신은 (픽셀 쉐이더를 추가하는 실버 라이트 컨트롤을 클릭) 액션 here on my blog에서 볼 수 있습니다.

문제의 픽셀 쉐이더는 이미지의 색조를 밝히는 데 사용되는 SilverSprite의 것입니다. 당신은 view its source code here 일 수 있습니다.

적용 대상 변환은 MatrixTransform입니다 (직접 계산 된 변환, 축척, 회전 행렬 사용). 이미지를 회전 할 때 문제가 나타납니다.

셰이더와 변환이 모두 적용되는 요소는 Canvas 코드에 추가 된 Image입니다. 이미지의 ImageSourceWriteableBitmap이지만 효과는 BitmapImage과 함께 발생합니다.

내 질문 : 이 퍼지 픽셀 화의 원인은 무엇입니까?줄이거 나 제거하기 위해 수행 할 수있는 작업은 무엇입니까?

+0

이것은 뻔한 질문으로 보일지 모르겠지만 쉐이더를 사용하지만 변환을하지 않으면 pixelation을 얻을 수 있습니까? – AnthonyWJones

+0

@Anthony : 흥미롭게도 그렇습니다. 그것은 훨씬 덜 분명하지만 ("모호하지"않습니다). 출력은 픽셀 스프라이트 (pixel-for-pixel)와 원래 스프라이트의 위치가 마치'Math.Floor'를 통과 한 것처럼 일치합니다. 픽셀 쉐이더도 제거하지만 분수 위치를 계속 사용하면 스프라이트가 픽셀간에 "블렌드"됩니다 (쌍 선형 보간으로 보임). –

+0

흥미로운 것은 회전없이 스케일 업 변환을 사용하면 출력은 쌍 선형 필터링을 사용하는 스프라이트이며 픽셀 쉐이더가 부착되어 있는지 여부도 마찬가지입니다 (여전히 'Math.Floor'작업을 수행하고있을 것입니다) 말할 수는 없지만). 스케일링 된 스프라이트를 회전 시키면 셰이더에서 여전히 "퍼지"효과를 얻게됩니다. 그러나 원래의 예제처럼 여전히 1 출력 픽셀 오프셋 스케일입니다. –

답변

2

PDC09에서 this presentation을보고 난 후에 Silverlight의 렌더링 시스템이 어떻게 작동하는지 훨씬 더 잘 알 수 있습니다. 이 문제는 프레젠테이션을 통해 직접 해결되지는 않지만 사물의 렌더링 순서가 도움이된다는 것을 알고 있습니다.

내 질문과 관련된 렌더링 단계의 순서는 다음과 같습니다. 개체의 자식 (및/또는 그 자체)이 렌더링되고 해당 렌더링이 Effect을 통과 한 다음 RenderTransform을 통과합니다.

이 객체 또는 그 아이들이 있었다 가지고 RenderTransform이 객체에 적용되는 모든 경우에 Effect 적용 (즉 : 오는 RenderTransformEffect 렌더링 트리에서 후) 나타납니다 RenderTransform이라고, 이 "퍼지 (fuzzyness)"를 생성하는 "저품질"모드로 수행됩니다.

용액 후,RenderTransformEffect에 이동한다. 필자의 경우 이는 ImageCanvas에 넣고 RenderTransformImage에, EffectCanvas에 적용하는 것을 의미합니다.

관련 문제