0

设置着色器

    muOffsetHandle = getUniformLocation("offset");      
    muWeightHandle = getUniformLocation("weight");

使用程序

    GLES20.glUniform1fv(muOffsetHandle, 1, mOffset, 0);
    GLES20.glUniform1fv(muWeightHandle, 1, mWeight, 0);

变量

private int muOffsetHandle;
private int muWeightHandle;

protected float mOffset[] =new float[] {0.0f, 1.3f, 3.3f}; 
protected float mWeight[] =new float[] {0.2f, 0.3f, 0.3f};

片段着色器

        "uniform float offset[3];\n" +
        "uniform float weight[3];\n" +

然后试图达到:重量[i]

我明白了:

着色器日志:0:13:S0004:成员引用或 swizzle 尝试在非结构和非向量上

第 13 行:tc += texture2D(uFrameBufferTexture, vTextureCoord[0].xy + vec2(0.0, offset[i])/uScreenHeight).rgb * weight[i];

(i = 0 到 2)

所以我的问题:如何绕过浮点数组到制服?浮动[3]

编码

protected static final String mFShader = 
        "precision mediump float;\n" +
        "varying vec2 vTextureCoord;\n" +
        "uniform float uTime;\n" +
        "uniform float uScreenWidth;\n" +
        "uniform float uScreenHeight;\n" +
        "uniform sampler2D uFrameBufferTexture;\n"+

        "uniform float offset[3];\n" +
        "uniform float weight[3];\n" +

        "void main() {\n"+
        "  vec3 tc = vec3(1.0, 0.0, 0.0);\n"+
        "  if (vTextureCoord[0].x<(uTime-0.01)) {\n"+
        "    tc = texture2D(uFrameBufferTexture, vTextureCoord[0].xy).rgb * weight[0];\n"+
        "    for (int i=1; i<3; i++) {\n"+
        "      tc += texture2D(uFrameBufferTexture, vTextureCoord[0].xy + vec2(0.0, offset[i])/uScreenHeight).rgb * weight[i];\n"+
        "      tc += texture2D(uFrameBufferTexture, vTextureCoord[0].xy - vec2(0.0, offset[i])/uScreenHeight).rgb * weight[i];\n"+
        "    }\n"+
        "  }\n"+
        "  else if (vTextureCoord[0].x>=(uTime+0.01)) {\n"+
        "    tc = texture2D(uFrameBufferTexture, vTextureCoord[0].xy).rgb;\n"+
        "  }\n"+
        "   gl_FragColor = vec4(tc, 1.0);\n"+
        "}\n";
4

2 回答 2

3

问题实际上不在于weightor offset。编译器抱怨你说vTextureCoord[0].xy,但你声明vTextureCoordvarying vec2 vTextureCoord;

要么声明vTextureCoord为数组,要么不说[0].

于 2012-06-14T09:24:33.003 回答
1

您不需要将其声明为数组,但如果您愿意,您可以简单地使用:

varying vec4 vTextureCoord[3]; // you can use anything you want between the brackets

另外,不要忘记修改顶点着色器的变化,以使它们相同。

于 2012-06-14T11:58:20.013 回答