首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当未使用的纹理和弦被传入时,GLSL ES像素着色器才能工作。

只有当未使用的纹理和弦被传入时,GLSL ES像素着色器才能工作。
EN

Stack Overflow用户
提问于 2014-02-06 21:09:48
回答 1查看 192关注 0票数 0

我有一个顶点着色器,共享在几个像素着色器-GLSLes2.0在iOS上。VS输出变换位置、法线和一组二维uv弦。这是它的最基本的部分:

代码语言:javascript
复制
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);
}

这是基于Cg着色器,它输出uv到TEXCOORD0,并使用TEXCOORD6作为正常。

我的问题是,以uv和弦和法线作为输入的PS是很好的,但是那些只取正常的不是。如果我将PS方法签名更改为被uv传递,但不要使用此签名,它是有效的!

这是预期的,明确的行为吗?如果是这样的话,是否有一种方法可以避免将不需要的参数传递给着色器,或者必须创建VS的多个版本?

EN

回答 1

Stack Overflow用户

发布于 2014-02-17 15:00:55

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

代码语言:javascript
复制
// 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#必须是不中断的顺序(‘TEXCOORD1 0,TEXCOORD1.

最重要的是,您应该将TEXCOORD6更改为TEXCOORD1。不管怎么说,如果没有您的代码,很难提出任何建议。当你设置你的着色器时,得到准确的编译错误是很好的。

另外,看一下这个参考来了解更多关于Cg阴影语言的信息:chapter03.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21614085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档