2012-10-30 4 views
1

게임에서 소프트웨어 렌더링을 사용하여 전체 화면 팔레트 (8 비트) 이미지를 메모리에 그립니다.Direct3D 9가있는 빠른 팔레트 화면 블리트

Direct3D를 사용하여 화면에 이미지를 저장하는 가장 빠른 방법은 무엇입니까?

현재 소프트웨어에서 팔레트 된 이미지를 RGB로 변환 한 다음 으로 잠근 D3DUSAGE_DYNAMIC 텍스처에 올려 놓습니다.

더 빠른 방법이 있습니까? 예 : palettization을 수행하기 위해 쉐이더를 사용합니까?

관련 질문 :

답변

3

팔레트 이미지가 포함 된 D3DFMT_L8 텍스처와 팔레트가 포함 된 256x1 D3DFMT_X8R8G8B8 이미지를 만듭니다.

HLSL 셰이더 코드 :

uniform sampler2D image; 
uniform sampler1D palette; 

float4 main(in float2 coord:TEXCOORD) : COLOR 
{ 
    return tex1D(palette, tex2D(image, coord).r * (255./256) + (0.5/256)); 
} 

참고 휘도 (팔레트 인덱스)하는 승산 - 가산 동작으로 조정된다. 팔레트 인덱스 255는 흰색 (최대 휘도)으로 간주되므로 float로 표현하면 1.0f가됩니다. 그 좌표에서 팔레트 텍스처를 읽으면 (단편 부분 만 사용되기 때문에) 팔레트 텍스처를 감싸고 첫 번째 팔레트 엔트리를 읽습니다.

로 컴파일 :

fxc /Tps_2_0 PaletteShader.hlsl /FhPaletteShader.h 

이처럼 사용

// ... create and populate texture and paletteTexture objects ... 
d3dDevice->CreatePixelShader((DWORD*)g_ps20_main, &shader) 
// ... 
d3dDevice->SetTexture(1, paletteTexture); 
d3dDevice->SetPixelShader(shader); 
// ... draw texture to screen as textured quad as usual ... 
1

에서 비슷한 질문은 당신은 palettization을 처리하는 간단한 픽셀 쉐이더를 작성할 수 있습니다. L8 동적 텍스처를 만들고 팔레트 화 된 이미지를 복사하여 팔레트 조회 텍스처 (또는 상수 메모리에 색상 배열)를 만듭니다. 그런 다음 텍스처로 설정된 팔레 타이 징 이미지와 룩업 텍스처 또는 상수 버퍼에서 팔레트 룩업을 수행하는 픽셀 쉐이더를 사용하여 전체 화면 쿼드를 렌더링합니다.

즉, CPU에서 팔레트 변환을 수행하는 것이 현대 CPU에서는 그리 비싸지 않아야합니다. 성능 병목 현상이 확실합니까?

+0

예, 나는 확신한다. 32 비트 DirectDraw 대 8 비트 Palette DirectDraw에서 CPU 사용량이 급격히 증가합니다. 지금 쉐이더를 살펴보고 있는데, 고마워요 (팔레트 텍스처를 샘플러 유니폼 변수에 바인딩하는 방법을 찾으려고합니다). –

+0

팔레트는 256 개의 엔트리 밖에 없으므로 텍스처 블렌딩이나 다른 것들을 활용할 필요가 없습니다. 팔레트 엔트리에 상수 버퍼를 사용할 수 있습니다. 이것은 텍스처를 사용하는 것보다 셰이더/바인딩 측에서 조금 더 간단합니다. D3D11로 가정). – mattnewport

+0

방금 ​​D3D9를 사용하고 있다는 것을 눈치 챘지만 팔레트 조회에 상수를 사용할 수 있어야하지만 D3D9의 픽셀 쉐이더에서 인덱스가있는 상수 조회가 제한되어 있으므로 팔레트 텍스처가 아마도 그렇습니다. 가다. – mattnewport