簡體   English   中英

C ++着色器問題

[英]C++ shader question

我正在使用Nvidia CGDirect3D9 ,並對以下代碼有疑問。

它可以編譯,但不會“加載”(使用cgLoadProgram包裝器),並且將所導致的故障描述為D3D failure happened

它是將着色器模型設置為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環境中測試類似的代碼,或者可以通過其他方式幫助我,那么我在等您;)

謝謝。

我認為你需要在紋理坐標上使用ddx / ddy確定循環前的漸變,然后使用tex2D(sampler2D samp, float2 s, float2 dx, float2 dy)

GPU總是渲染四邊形而不是像素(即使在像素邊界上 - 渲染后端丟棄了多余的像素)。 這樣做是因為它允許它始終計算屏幕空間紋理派生,即使您使用計算出的紋理坐標也是如此。 只需取像素中心的值之差即可。

但這在問題代碼中使用動態分支時不起作用,因為單個像素處的着色器處理器的控制流可能會有所不同。 因此,您需要先通過ddx / ddy手動計算導數,然后才能使程序流分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM