一些制服工作其他人没有

时间:2016-03-02 20:16:44

标签: opengl-es glsles

我在使用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没有做任何事情所以我尝试在顶点着色器中进行实验,然后最终发现它始终保持初始值无论什么命令它被定义,它是什么类型,它的名字等。

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

  

编译 - >链接 - >使用程序 - >获取位置 - >初始化   均匀的

并且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);
    }

我很可能错过了一些微不足道的东西,但我似乎无法找到它......在Android上使用Xamarin。

1 个答案:

答案 0 :(得分:0)

没关系,似乎GL.Uniform *重载直接取个别值而不是引用至少在OpenGLES20中不起作用。