Attributes 顶点着色器不更改顶点坐标

Attributes 顶点着色器不更改顶点坐标,attributes,opengl-es-2.0,shader,Attributes,Opengl Es 2.0,Shader,在过去的几周里,我一直在学习OpenGLES2.0,到目前为止,我所做的一切都涉及到使用一个程序。我现在希望使用多个程序,这样我可以有不同的着色器做不同的事情 我遇到的问题是新程序和着色器正在使用,但它们使用的是上一个程序的顶点坐标。我已经将坐标绑定到一个单独的索引槽,但是在那里它们没有被使用 我知道使用了正确的着色器,因为三角形闪烁的是蓝色而不是红色。因此,我认为这是属性加载的问题 我的代码: 着色器 char vertexShaderSource[] = "attribute vec

在过去的几周里,我一直在学习OpenGLES2.0,到目前为止,我所做的一切都涉及到使用一个程序。我现在希望使用多个程序,这样我可以有不同的着色器做不同的事情

我遇到的问题是新程序和着色器正在使用,但它们使用的是上一个程序的顶点坐标。我已经将坐标绑定到一个单独的索引槽,但是在那里它们没有被使用

我知道使用了正确的着色器,因为三角形闪烁的是蓝色而不是红色。因此,我认为这是属性加载的问题

我的代码:

着色器

char vertexShaderSource[] =
    "attribute vec4 Position;   \n"
    "uniform mat4 uMvp;          \n"
    "void main()                 \n"
    "{                           \n"
    "gl_Position = uMvp * Position; \n"
    "}                           \n";

    char fragmentShaderSource[] =
    "precision highp float;\n"
    "uniform float time;\n"
    "void main()\n"
    "{\n"
    "float c1 = sin(time);\n"
    "if (c1 >= 0.0)"
    "gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
    "else\n"
    "gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n"
    "}\n";

    char vertexShaderSource1[] =
    "attribute vec4 Position1;   \n"
    "uniform mat4 uMvp;          \n"
    "void main()                 \n"
    "{                           \n"
    "gl_Position = uMvp * Position1; \n"
    "}                           \n";

    char fragmentShaderSource1[] =
    "precision highp float;\n"
    "uniform float time;\n"
    "void main()\n"
    "{\n"
    "float c1 = sin(time);\n"
    "if (c1 >= 0.0)"
    "gl_FragColor = vec4(0.0,0.0,1.0,1.0);\n"
    "else\n"
    "gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n"
    "}\n";
glBindAttribLocation(mShader, 0, "Position");
glBindAttribLocation(mShader1, 1, "Position1");
将属性绑定到单独的索引

char vertexShaderSource[] =
    "attribute vec4 Position;   \n"
    "uniform mat4 uMvp;          \n"
    "void main()                 \n"
    "{                           \n"
    "gl_Position = uMvp * Position; \n"
    "}                           \n";

    char fragmentShaderSource[] =
    "precision highp float;\n"
    "uniform float time;\n"
    "void main()\n"
    "{\n"
    "float c1 = sin(time);\n"
    "if (c1 >= 0.0)"
    "gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
    "else\n"
    "gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n"
    "}\n";

    char vertexShaderSource1[] =
    "attribute vec4 Position1;   \n"
    "uniform mat4 uMvp;          \n"
    "void main()                 \n"
    "{                           \n"
    "gl_Position = uMvp * Position1; \n"
    "}                           \n";

    char fragmentShaderSource1[] =
    "precision highp float;\n"
    "uniform float time;\n"
    "void main()\n"
    "{\n"
    "float c1 = sin(time);\n"
    "if (c1 >= 0.0)"
    "gl_FragColor = vec4(0.0,0.0,1.0,1.0);\n"
    "else\n"
    "gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n"
    "}\n";
glBindAttribLocation(mShader, 0, "Position");
glBindAttribLocation(mShader1, 1, "Position1");
Draw()函数

glUseProgram(mShader);
        checkGLError("glUseProgram");
        // ========================================================================
        // define vertex coordinates
        GLfloat Vertices[] = { -0.6f,  0.6f, 0.0f,
                               -0.5f, 0.48f, 0.0f,
                               -0.7f, 0.48f, 0.0f  };

        // ========================================================================
        // Clear the color buffer
        glClear(GL_COLOR_BUFFER_BIT);

        // ========================================================================
        // Set uniform function
        glUniformMatrix4fv(mMvpLoc, 1, false, MyMatrix);
        checkGLError("glUniform4fv");

        glUniform1f(mTimeLoc, (maGetMilliSecondCount() - mStartTime) * 0.001f);
        checkGLError("glUniform1f");

        // ========================================================================
        // Load the attribute data to the shaders
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, Vertices);
        checkGLError("glVertexAttribPointer");

        glEnableVertexAttribArray(0);
        checkGLError("glEnableVertexAttribArray");

        // ========================================================================
        // Draw verticies
        glDrawArrays(GL_TRIANGLES, 0, 3);
        checkGLError("glDrawArrays");





        glUseProgram(mShader1);
        checkGLError("glUseProgram");
        // ========================================================================
        // define vertex coordinates
        GLfloat Vertices1[] = { -0.5f, 0.12f, 0.0f,
                                -0.6f, 0.0f, 0.0f,
                                -0.7f, 0.12f, 0.0f  };

        // ========================================================================
        // Clear the color buffer
        glClear(GL_COLOR_BUFFER_BIT);

        // ========================================================================
        // Set uniform function
        glUniformMatrix4fv(mMvpLoc, 1, false, MyMatrix);
        checkGLError("glUniform4fv");

        glUniform1f(mTimeLoc, (maGetMilliSecondCount() - mStartTime) * 0.001f);
        checkGLError("glUniform1f");

        // ========================================================================
        // Load the attribute data to the shaders
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, Vertices1);
        checkGLError("glVertexAttribPointer");

        glEnableVertexAttribArray(1);
        checkGLError("glEnableVertexAttribArray");

        // ========================================================================
        // Draw verticies
        glDrawArrays(GL_TRIANGLES, 0, 3);
        checkGLError("glDrawArrays");

我想出来了。我将program1的属性位置的索引更改为位于索引槽0中。我还必须在我的第二个着色器绘制函数中取出清除缓冲区,这样它就不会删除绘制的第一个三角形