【问题标题】:CgFx compiler error "Unknown state 'VertexShader'"CgFx 编译器错误“未知状态 'VertexShader'”
【发布时间】:2012-07-22 09:14:31
【问题描述】:

我有以下 CgFx 文件:

struct VertIn {
  float4 pos   : POSITION;
  float4 color : COLOR0;
};
struct VertOut {
  float4 pos   : POSITION;
  float4 color : COLOR0;
};
VertOut vert(VertIn IN) {
  VertOut OUT;
  OUT.pos     = IN.pos;
  OUT.color   = IN.color;
  OUT.color.z = 0.0f;
  return OUT;
}
struct FragIn {
  float4 color: COLOR;
};
struct FragOut {
  float4 color : COLOR;
};
FragOut frag(FragIn IN) {
  FragOut OUT;
  OUT.color = IN.color;
  OUT.color.y = 0.0f;
  return OUT;
}
struct GeomIn {
  float4 position : POSITION;
  float4 color : COLOR0;
};
TRIANGLE void geom(AttribArray<GeomIn> IN) {
  for(int i=0; i<IN.length; i++) {
    emitVertex(IN[i]);
  }
}
technique technique0 {
  pass p0 {
    VertexShader = compile gp4vp vert();    //line 47
    FragmentShader = compile gp4fp frag();  //line 48
    GeometryShader = compile gp4gp geom();  //line 49
  }
}

当使用 cgc 验证 3 个着色器时,它们都编译正常。

但是当我尝试使用以下方法编译整个效果时:

context=cgCreateContext();
effect=cgCreateEffectFromFile(context, "my_shader.cgfx", NULL);
if(!effect) {
  printf(ygl.cgGetLastErrorString(NULL));
  printf(cgGetLastListing(context));
}

然后我收到以下错误:

CG ERROR : The compile returned an error.
my_shader.cgfx(47) : error C8001: Unknown state 'VertexShader'
my_shader.cgfx(48) : error C8001: Unknown state 'FragmentShader'
my_shader.cgfx(49) : error C8001: Unknown state 'GeometryShader'

我做错了什么?

【问题讨论】:

    标签: opengl shader nvidia cg


    【解决方案1】:

    创建上下文后,您需要调用

    cgGLRegisterStates(handle);
    

    handle 是您的 CG 上下文句柄。这将注册VertexShaderPixelShaderFillMode 等内容。我不确定为什么默认情况下没有注册这些内容,但你已经有了。

    【讨论】:

      【解决方案2】:

      好吧,解决了,但不知道如何。我认为编译器没有预料到 CgFx,因为我之前确实加载了一个 cg 配置文件,所以它试图使用那个。但不确定。

      【讨论】: