0

我有一个顶点着色器,在几个像素着色器之间共享——iOS 上的 GLSL ES 2.0。VS 输出转换后的位置、法线和一组 2D uv 坐标。这是它的基本信息:

void main() {
    vec4 xlt_outPos;
    vec3 xlt_outNormal;
    vec2 xlt_uv0;
    xray_bone_vp( vec4(vertex), vec3(normal), vec2(uv), xlt_outPos, xlt_outNormal, xlt_uv0);
    gl_Position = vec4( xlt_outPos);
    xlv_TEXCOORD6 = vec3( xlt_outNormal);
    xlv_TEXCOORD0 = vec2( xlt_uv0);
}

这是基于将 uv 输出到 TEXCOORD0 并使用 TEXCOORD6 作为法线的 Cg 着色器。

我的问题是,将 uv 坐标法线作为输入的 PS 工作正常,但采用法线的 PS却不行。如果我将 PS 方法签名更改为通过 uv 但不使用它,它可以工作!

这是预期的、定义明确的行为吗?如果是这样,有没有办法避免将不需要的参数传递给着色器或必须创建多个版本的 VS?

4

1 回答 1

1

我可以假设 VS 输出结构和 PS 输入是不同的。正确的代码应该是这样的:

// declare vertex-to-pixel data structure:
struct v_Output {
    float4 position : POSITION;
    float2 texCoord0 : TEXCOORD0;
    float2 texCoord1 : TEXCOORD1;
};

v_Output vertex_shader(...) {
    ...
    return (v_Output)output_data;
}

void pixel_shader(float2 texCoord0 : TEXCOORD0,
                  float2 texCoord1 : TEXCOORD1,
                  out float4 color : COLOR {
    color = ...;
}

并且有一些规则:

  • 您不能在像素着色器字段中要求顶点着色器不产生
  • TEXCOORD#必须是不间断的顺序 (`TEXCOORD0, TEXCOORD1...)

最重要的是,您应该更改TEXCOORD6TEXCOORD1. 无论如何,如果没有您的代码,很难提出任何建议。当你设置你的着色器时,得到精确的编译错误会很好。

另外,请查看此参考以了解有关 Cg 着色语言的更多信息:http: //http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter03.html

于 2014-02-17T15:00:55.567 回答