我最近开始使用Nvidia Cg
着色器,如果我在Nvidia GPU
(在我的情况下为GTS250
)上进行操作,一切看起来都很正常。
我尝试在ATI HD4650
上启动相同的(我自己的测试应用程序)并且没有看到输出。在那之后,我开始尝试使用测试示例(提供Nvidia Cg 3.0
)和6/7工作,但第一个(似乎是最简单的)不会。
以下是着色器代码:
// This is C2E1v_green from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard. See page 38.
struct C2E1v_Output {
float4 position : POSITION;
float3 color : COLOR;
};
C2E1v_Output C2E1v_green(float2 position : POSITION)
{
C2E1v_Output OUT;
OUT.position = float4(position,0,1);
OUT.color = float3(0,1,0);
return OUT;
}
我不知道为什么这个简单的着色器不起作用,而例如同一个着色器配对与下面的passthru-shader一起工作(来自{{1}的示例2) }):
Nvidia Cg SDK
有人面临同样的麻烦吗?有什么想法吗?
谢谢。
在此更新:启用最大调试输出会使问题变得明显:
// This is C2E2f_passthru from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard. See page 53.
struct C2E2f_Output {
float4 color : COLOR;
};
C2E2f_Output C2E2f_passthru(float4 color : COLOR)
{
C2E2f_Output OUT;
OUT.color = color;
return OUT;
}
该软件包中的第一个示例是唯一一个仅包含顶点着色器的示例,没有任何(甚至是简单的直通)像素着色器。我不知道为什么Nvidia Cg运行时会在这种情况下生成不兼容的着色器,但它显然只在一个有点旧的GPU(vs_3_0 shader executed in hardware vertex processing mode can only be paired
with at least a ps_3_0 shader
)上失败。
无论如何,我愚蠢到没有打开调试输出就可以工作。
2 Alex Farber:我想你可以发布一个虚拟答案,这样我就可以奖励你,因为你帮助我意识到我忘了打开调试。谢谢。
答案 0 :(得分:1)
在DirectX控制面板中设置Debug DirectX版本并查看跟踪输出以了解此失败的原因。
顺便说一句,我和我的像素着色器有相同的情况,并在GameDev.net DirectX论坛上得到了帮助。我记得最后我使用SDK转换工具将着色器转换为最低版本,并且它在没有像素着色器的情况下工作。根据GPU提供商的说法,这种行为符合DirectX规范。