[英]C++ shader question
我正在使用Nvidia CG
和Direct3D9
,並對以下代碼有疑問。
它可以編譯,但不會“加載”(使用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.