2012-04-15 83 views
11

2.0要開始與我的主要問題:像素着色器模型>在FireMonkey

我可以使用像素着色器模型3,4或5我的FireMonkey應用程序?

我希望能夠在我的FireMonkey程序中動態創建像素着色器。 爲此,我現在使用DirectX SDK附帶的fxc.exe編譯像素着色器,並將編譯的代碼加載到我的TShaderFilter後代中。這工作正常(讓我知道如果你對我是如何做到這一點感興趣的話)。

但是,如果我使用ps_2_0作爲目標配置文件進行編譯,我只能使其工作。

我目前遇到着色器模型2.0的限制。例如,循環似乎被編譯器展開,並且您可以在2級着色器中使用最多數量的指令。因此,可能性的數量相當有限。


實施例: 下面的着色器代碼創建一個曼德爾布羅分形。如果我設置Iterations太高,它不會編譯。錯誤信息:

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; 
} 

的Shader Model ps_3_0我可以用更多的迭代編譯,但編譯着色器似乎並不FireMonkey工作。我沒有收到任何錯誤消息;結果我只是得到一張紅色的圖像。


是否有人在這裏有關於如何解決這個問題的任何想法,或者是FireMonkey只是不能夠利用我的顯卡的全部潛能?

請注意,我已經看到FireMonkey的最低要求是具有着色器級別2.0的圖形卡,但尚不清楚這是否意味着您無法使用着色器級別3或更高級別。

+3

+1,有趣的問題!我也有興趣閱讀你如何編譯和使用着色器。 – 2012-04-16 09:05:52

回答

3

這個答案是在寫作時是正確的,但很可能會改變,因爲FireMonkey開發:

不能使用PixelShader或的ShaderModel 3.0或更高版本,因爲FireMonkey(Windows下)使用DirectX 9,而PixelShader/ShaderModel 3.0+是DirectX 10的功能。 如果您在Winapi.D3DX9.pas(第2871-2872行)中查看,您將能夠確認ps_3_0不是有效的標記,而在Winapi.D3DX10.pas(第3224-3230行)它被支持。

所以,你能夠使用PixelShader/ShaderModel 3.0+的唯一方法就是自己修改FireMonkey來使用DirectX 10上下文,或者請求(有其他人的支持)Embarcadero爲你改變它。

+1

我認爲這是錯誤的。 DirectX 9.0c(從2004年起)支持着色器模型3.0。 SM2附帶了原始的DirectX9.0版本,但9.0c已經有8年的歷史,並且非常標準。 DirectX 10引入了SM4。我沒有檢查Pascal翻譯,所以也許他們錯過了一個有效的標記,但這意味着如果FMX使用DirectX 9,它肯定能夠使用SM3。 – 2012-05-14 09:37:36

+0

你可能是對的。我可以肯定地說,Delphi的DX9轉換不*提供ps_3_0標誌。我不完全確定DirectX 9.0c是否添加了SM 3.0和PS 3.0,但Delphi的頭文件肯定不會。 – LaKraven 2012-05-17 17:12:07