2010-11-11 132 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手动计算派生值。