2010-05-31 4 views
6

HSLS 픽셀 쉐이더를 사용하여 이미지의 모든 픽셀 합계를 효율적으로 계산하려면 어떻게해야합니까? Pixel Shader 2.0에 관심이 있습니다. WPF 쉐이더 효과로 호출 할 수 있습니다.모든 픽셀의 효율적인 픽셀 쉐이더 합

+0

'모든 픽셀의 합'이라고 말하면 무슨 의미입니까? 모든 R/G/B 값의 합 또는 다른 값입니까? –

답변

-1

WPF의 효과는 시각적 결과를 생성하는 데 훨씬 적합합니다. 당신이 다른 유형의 계산을 위해 사용하고자하는 것처럼 들리지만, 이렇게하려면 이미지 결과를 데이터로 처리해야합니다. 소프트웨어에서 RenderTargetBitmap이 필요합니다. GPGPU 용으로 설계된 이러한 프로젝트를 살펴볼 수 있습니다.

Brahma

OpenTK

Accelerator 나는 OpenTK에서 OpenCL을 바인딩의 상태를 잘 모릅니다. 다이렉트 컴퓨 트 (DirectCompute) 및 쿠다 (CUDA)와 같은 다른 기술도 한발 가치가 있습니다.

6

셰이더를 사용하지 않는 훨씬 간단한 솔루션이 있습니다. 이미지를 텍스처로로드하고, 밉맵 체인을 만들고, 마지막 밉맵 (1x1 픽셀)의 값을 다시 읽습니다. 이 트릭은 게임에서 광범위하게 (예 : HDR 톤 매핑을 적용하기 위해) 장면의 평균 밝기를 계산하는 데 사용됩니다. 정확성보다 단순성과 효율성을 중시한다면 위대한 트릭입니다.

+0

WPF의 이미지에서 밉맵 체인을 정확하게 작성하는 방법은 픽셀 쉐이더를 적용하는 것과 똑같은 속도입니까? – luvieere

+0

상자 필터를 사용하여 1x1로 이미지 크기를 조정합니다. –

+0

고맙습니다. 내 텍스처는 다소 퇴색되어 있고 (정밀도가 높은 수치 FFT) 삼각형 필터를 사용하면 매우 좋은 결과를 얻을 수 있습니다 (원하는 결과의 1 % 또는 1 % 감소). 상자 필터는 벗어났다. – Thomas

3

는 화상 R/G/B를 채널 값을 합산하도록 가정 (그리고 원래 픽셀을 파괴 할 수있는 것으로 가정) - 여기 내 부분적인 해결책이다

  1. 각각 10 화소의 평균 색을 계산하는 것 이웃하는 10 개의 픽셀을 이미지에 평균화합니다.
  2. 그런 다음 각 10 번째 픽셀의 CPU 측 합계
    Pix_Value*10
    .

이 경우 우리는 CPU 측의 픽셀 값 합산에 비해 약 10 배의 속도 향상을 얻습니다.

+0

그건 좋은거야, +1 – luvieere

+0

CPU가 필요 없어 GPU에서 모든 작업을 수행 할 수 있습니다. "비효율적 인"방법으로는이 접근법을 설명하기 시작하지 않으며 CPU-GPU 통신 비용도 고려하지 않습니다. -1 – Thomas