有些制服有效,有些则无效

Some uniforms work others don't

我在使用 OpenGLES 着色器管道时遇到问题。我有一个带有 3 个制服的着色器

attribute vec4 position;

uniform mat4 modelViewProjection;
uniform vec3 objectColor;
uniform vec2 positionObject;

void main()
{
    vec4 pos = vec4(-positionObject.x + objectColor.x, 0, -positionObject.y, 0);
    gl_Position =  modelViewProjection * (position + pos);
}

modelViewProjection 和 positionObject 工作得很好,但是在尝试让片段着色器工作时我注意到 objectColor 没有做任何事情所以我尝试在顶点着色器中进行试验,然后最终发现它总是保持初始值 no不管它定义的顺序是什么,它是什么类型,它的名字等等

我正在遵循着色器管道的标准程序:

compiling -> linking -> use program -> get location -> initialize uniform

并且 objectColor 制服甚至获得了作为活动制服的 ID,并且它被计入活动制服,但是每当我尝试更改它的值时它总是保持为零。

下面是代码片段:

统一位置:

private void BindUniforms()
{
    glUniforms[(int)UNIFORMS_T.MODEL_VIEW_PROJECTION] = GL.GetUniformLocation(glProgramId, "modelViewProjection");
    glUniforms[(int)UNIFORMS_T.OBJECT_POSITION] = GL.GetUniformLocation(glProgramId, "positionObject");
    glUniforms[(int)UNIFORMS_T.OBJECT_COLOR] = GL.GetUniformLocation(glProgramId, "objectColor");
}

渲染第 1 部分:

protected override void OnRenderFrame(FrameEventArgs e)
{
    base.OnRenderFrame(e);

    GL.ClearColor(0f, 0f, 0f, 1f);
    GL.Clear((uint)All.ColorBufferBit);
    GL.UseProgram(shader.glProgram);

    GL.UniformMatrix4(shader.GetUniform(Shader.UNIFORMS_T.MODEL_VIEW_PROJECTION), 1, false, ref modelViewProjection.Row0.X);
    GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1);

    lattice.Draw();

    SwapBuffers();
}

渲染第 2 部分:

    public void Draw()
    {
        //Update Uniform
        GL.Uniform2(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), 1, ref m_vec2Position.X);
        GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1);

        var colVal = new Vector3(-1, -1, -1); //becomes 0, 0, 0
        var posVal = new Vector2(-1, -1);     //becomes arbitrary value
        GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), ref colVal.X);
        GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), ref posVal.X);

        // Update attribute values.
        GL.BindBuffer(All.ArrayBuffer, glVBO);
        GL.VertexAttribPointer((int)Shader.ATTRIBUTES_T.VERTEX_POSITION, 3, All.Float, false, sizeof(float) * 3, IntPtr.Zero);
        GL.EnableVertexAttribArray((int)Shader.ATTRIBUTES_T.VERTEX_POSITION);

        GL.BindBuffer(All.ElementArrayBuffer, glVBI);
        GL.DrawElements(All.LineStrip, Indices.Length, All.UnsignedShort, IntPtr.Zero);

        GL.BindBuffer(All.ArrayBuffer, 0);
        GL.BindBuffer(All.ElementArrayBuffer, 0);
    }

我很可能遗漏了一些微不足道的东西,但我似乎找不到...将 Xamarin 与 Android 结合使用。

没关系,似乎 GL.Uniform* 重载完全采用单个值而不是引用,至少在 OpenGLES20 中不起作用。