2010-11-11 119 views
0

我正在使用Nvidia CGDirect3D9並且有關於下面的代碼的問題。C++着色器問題

它會編譯,但不會「加載」(使用cgLoadProgram包裝),並將產生的故障簡單描述爲D3D failure happened

它的Shader Model編譯像素着色器的一部分設定爲3.0

什麼可能是有趣的是,這種着色器加載在下列情況下罰款:

1)手動展開while語句(對許多if { }語句)。

2)刪除循環中tex2D函數的行。

3)切換到着色器模型2_X並手動展開循環。着色器代碼的


問題的一部分:

float2 tex = float2(1, 1); 
float2 dtex = float2(0.01, 0.01); 

float h = 1.0 - tex2D(height_texture1, tex); 
float height = 1.00; 

while (h < height) 
{ 
    height -= 0.1; 
    tex += dtex; 

    // Remove the next line and it works (not as expected, 
    // of course) 
    h = tex2D(height_texture1, tex); 
} 

如果有人知道爲什麼會發生這種情況或會在非CG環境中測試similiar代碼或能幫助我在一些其他的方式,我在等你;)

謝謝。

回答

2

我認爲你需要使用的紋理座標DDX/DDY來確定迴路之前的梯度,然後用tex2D(sampler2D samp, float2 s, float2 dx, float2 dy)

的GPU總是呈現四邊形不是像素(即使在像素邊界 - 多餘的像素被丟棄渲染後端)。這是因爲它允許它總是計算屏幕空間紋理派生,即使使用計算的紋理座標。它只需要取像素中心的值之間的差異。

但是,如果在問題的代碼中使用動態分支,則這不起作用,因爲各個像素的着色器處理器可能在控制流中發散。所以你需要在程序流發散之前通過ddx/ddy手動計算派生值。