2013-08-15 4 views
0

Ive изучал openGL ES 2.0 за последние несколько недель, и все, что я сделал до сих пор, связано с использованием одной программы. Im теперь ищут использовать несколько программ, поэтому у меня могут быть разные шейдеры, которые делают разные вещи.Vertex shader не меняет координаты вершин

Проблема, с которой я столкнулся, заключается в использовании новой программы и шейдеров, но они используют вершинные координаты предыдущей программы. Я привязал координаты к отдельному слоту индекса, но там они не используются.

Я знаю, что правильный шейдер используется, потому что треугольник мигает синим, а не красным. Поэтому я думаю, что это проблема с загрузкой атрибутов.

Мой код:

шейдеры

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"; 

Bind атрибуты для разделения индексов

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"); 

ответ

0

Я понял. Я изменил индекс местоположения атрибута для программы1, чтобы он находился в индексном слоте 0. Мне также пришлось вытащить прозрачный буфер во вторую функцию выделения шейдера, чтобы он не удалил первый треугольник.