2012-04-15 3 views
11

2.0 내 주요 질문을 시작하려면> :픽셀 쉐이더 모델은 FireMonkey

내가 내 FireMonkey 애플리케이션에서 픽셀 쉐이더 모델 3, 4 또는 5를 사용할 수 있습니까?

내 FireMonkey 프로그램에서 픽셀 쉐이더를 동적으로 만들 수 있기를 원합니다. 그러기 위해 DirectX SDK와 함께 제공되는 fxc.exe를 사용하여 픽셀 쉐이더를 컴파일하고 컴파일 된 코드를 TShaderFilter 자손으로로드합니다. 그게 잘 작동합니다 (내가 어떻게하는지에 관심이 있다면 알려주십시오).

그러나 ps_2_0을 대상 프로필로 사용하여 컴파일하면 작동 할 수 있습니다.

저는 현재 셰이더 모델 2.0의 제한 사항을 실행하고 있습니다. 예를 들어 루프는 컴파일러에 의해 풀려진 것처럼 보이며 레벨 2 쉐이더에서 가질 수있는 최대 명령어 수는 있습니다. 그렇기 때문에 가능성의 수는 제한되어 있습니다.


예 : 셰이더 코드는 아래 브로트 프랙탈을 생성한다. Iterations을 너무 높게 설정하면 컴파일되지 않습니다. 오류 메시지 : 쉐이더 좀 더 반복으로 컴파일 할 수 있습니다 ps_3_0 모델,하지만 컴파일 된 쉐이더와

error X5608: Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64.

#define Iterations 12 

float2 Pan; 
float Zoom; 
float Aspect; 
float4 main(float2 texCoord : TEXCOORD0) : COLOR0 
{ 
    float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan; 
    float2 v = 0;   
    for (int n = 0; n < Iterations; n++) 
    { 
     v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c; 
    }   
    return (dot(v, v) > 1) ? 1 : 0; 
} 

FireMonkey에서 작동하지 않습니다. 오류 메시지가 표시되지 않습니다. 나는 결과적으로 붉은 색 이미지를 얻는다.


여기 사람이이 문제를 해결하는 방법에 대한 어떤 생각을 가지고 있는가, 또는 FireMonkey 그냥 내 그래픽 카드의 잠재력을 최대한 활용 할 수 없음?

FireMonkey의 최소 요구 사항은 쉐이더 레벨 2.0의 그래픽 카드이지만, 쉐이더 레벨 3 이상을 사용할 수 없다는 것은 확실하지 않습니다.

+3

+1 재미있는 질문! 나는 셰이더를 컴파일하고 사용하는 방법을 읽는 것에 흥미가있을 것이다. –

답변

3

이 답변이 글을 쓰는 시점에서 정확하지만 FireMonkey는 개발로 가능하게 변경됩니다 :

당신은 PixelShader를 사용할 수 없습니다 또는 쉐이더 모델 3.0 이상 (Windows에서) FireMonkey는 다이렉트 X 9 사용하기 때문에, PixelShader/ShaderModel 3.0+는 DirectX 10의 기능입니다. Winapi.D3DX9.pas (줄 2871-2872)을 보면 (줄 3224-3230)에있는 동안 ps_3_0이 유효한 토큰이 아니라는 것을 확인할 수 있습니다. 그것은 지원됩니다.

PixelShader/ShaderModel 3.0 이상을 사용할 수있는 유일한 방법은 FireMonkey를 직접 수정하여 DirectX 10 컨텍스트를 사용하거나 다른 사용자의지지를 얻어 Embarcadero에서 변경하도록 요청하는 것입니다 .

+1

이것이 잘못된 것 같습니다. DirectX 9.0c (2004 년부터)는 셰이더 모델 3.0을 지원합니다. SM2는 원래 DirectX9.0 릴리스와 함께 제공되었지만 9.0c는 8 년이며 매우 표준입니다. DirectX 10은 SM4를 도입했습니다. 필자는 파스칼 변환을 검사하지 않았기 때문에 유효 토큰이 누락 된 것일 수 있습니다. 그러나 이것은 FMX가 DirectX 9를 사용한다면 확실히 SM3을 사용할 수 있어야한다는 것을 의미합니다. –

+0

당신이 옳을 수도 있습니다. 제가 확실히 말할 수있는 것은 DX9 용 델파이의 번역은 ps_3_0 플래그를 제공하지 않는 것입니다. DirectX 9.0c가 SM 3.0과 PS 3.0을 추가했는지 확실하지 않지만 델파이의 헤더는 그렇지 않습니다. – LaKraven