C ++ Nvidia Cg问题

时间:2010-09-17 07:44:48

标签: c++ shader nvidia cg

我最近开始使用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:我想你可以发布一个虚拟答案,这样我就可以奖励你,因为你帮助我意识到我忘了打开调试。谢谢。

1 个答案:

答案 0 :(得分:1)

在DirectX控制面板中设置Debug DirectX版本并查看跟踪输出以了解此失败的原因。

顺便说一句,我和我的像素着色器有相同的情况,并在GameDev.net DirectX论坛上得到了帮助。我记得最后我使用SDK转换工具将着色器转换为最低版本,并且它在没有像素着色器的情况下工作。根据GPU提供商的说法,这种行为符合DirectX规范。