2014-12-17 3 views
1

Я пишу приложение, позволяющее рисовать свободный стиль (используя палец) и рисовать изображение. Я отправил одну из моих проблем в OpenGL ES glFragColor depend on if condition on Fragment shader in iOS. Спасибо за многие предложения, я решил это. Теперь у меня есть еще одна новая проблема.Конфликт на OpenGLES на iOS

У меня есть 2 программы, которые имеют id PROGRAM_POINT (рисование свободного стиля) и PROGRAM_POINT_0 (рисовать изображение). Они инициализируются. Каждая программа имеет пару шейдерных файлов. PROGRAM_POINT имеет шейдерные файлы с именем point.vsh и point.fsh. Для PROGRAM_POINT_0 - texture.vsh и texture.fsh.

Вот эти файлы

---- point.vsh ------

attribute vec4 inVertex; 

uniform mat4 MVP; 
uniform float pointSize; 
uniform lowp vec4 vertexColor; 

varying lowp vec4 color; 

void main() 
{ 
    gl_Position = MVP * inVertex; 
    gl_PointSize = pointSize; 
    color = vertexColor; 
} 

---- point.fsh -------

precision mediump float; 

uniform sampler2D texture; 
varying lowp vec4 color; 

void main() 
{ 
    //Drawing point 
    gl_FragColor = color * texture2D(texture, gl_PointCoord); 
} 

---- texture.vsh --------

attribute vec4 a_Position; 
attribute vec2 a_TextureCoordinates; 

varying vec2 v_TextureCoordinates; 

void main() 
{ 
    v_TextureCoordinates = a_TextureCoordinates; 
    gl_Position = a_Position; 
} 

---- текстуры .fsh ------

precision mediump float; 

uniform sampler2D u_TextureUnit; 
varying vec2 v_TextureCoordinates; 

void main() 
{ 
    //Draw texture 
    gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates); 
} 

Кроме того, здесь рисунок свободный стиль и образ

--- Рисование свободный стиль -----

glBindBuffer(GL_ARRAY_BUFFER, vboId); 
    glBufferData(GL_ARRAY_BUFFER, vertexCount*2*sizeof(GLfloat), vertexBuffer, GL_DYNAMIC_DRAW); 

    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    // the brush texture will be bound to texture unit 0 
    glUniform1i(program[PROGRAM_POINT].uniform[UNIFORM_TEXTURE], 0); 

    glUseProgram(program[PROGRAM_POINT].id); 
    glDrawArrays(GL_POINTS, 0, (int)vertexCount); 

--- Нанесение изображения -----

GLuint a_position_location = glGetAttribLocation(program[PROGRAM_POINT_0].id, "a_Position"); 
    GLuint a_texture_coordinates_location = glGetAttribLocation(program[PROGRAM_POINT_0].id, "a_TextureCoordinates"); 
    GLuint u_texture_unit_location = glGetUniformLocation(program[PROGRAM_POINT_0].id, "u_TextureUnit"); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texName); 
    glUniform1i(u_texture_unit_location, 0); 

    const float textrect[] = {-1.0f, -1.0f, 0.0f, 0.0f, 
     -1.0f, 1.0f, 0.0f, 1.0f, 
     1.0f, -1.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 1.0f, 1.0f}; 

    glBindBuffer(GL_ARRAY_BUFFER, vboId_1); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(textrect), textrect, GL_STATIC_DRAW); 

    glVertexAttribPointer(a_position_location, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(0)); 
    glVertexAttribPointer(a_texture_coordinates_location, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); 

    glEnableVertexAttribArray(a_position_location); 
    glEnableVertexAttribArray(a_texture_coordinates_location); 

    glUseProgram(program[PROGRAM_POINT_0].id); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    [context presentRenderbuffer:GL_RENDERBUFFER]; 

А теперь вопрос будет, если необходимо выполнить следующие действия:

  • рисование свободного стиля (все еще отлично)

Still fine

  • Нанесение изображения (еще штраф)

Still fine

  • снова Рисунок свободного стиля (ПРОБЛЕМЫ БЫВАЕТ !!!)

PROBLEM !!!

Цвета номер 3 и 4 изменяются и кажется ужасным. Я полагаю, что это слилось или противоречило после рисования изображения. Нужно ли очищать буфер после рисования изображения.

ответ

2

point.fsh фрагментарный шейдер использует текстуру, но ваш код GL-кода с рисунком не имеет glBindTexture. Таким образом, он будет использовать последнюю текстуру glBindTexture-ed.

Кроме того, «Рисование свободного стиля» включает один массив атрибутов вершин.

glEnableVertexAttribArray(ATTRIB_VERTEX) 

Однако «Рисование изображения» позволяет использовать два массива атрибутов.

Вы должны вызвать glDisableVertexAttribArray перед другим glDrawArrays.

Или вы можете использовать VAO. Пожалуйста, взгляните на the Apple Document.

+0

Спасибо @KazukiSakamoto, я нашел решение, как и ваше. Идея такая же, она использует предыдущую текстуру. Итак, помимо вашего предложения, могу ли я повторно связать текстуру с рисунком –

+0

Да, вы можете связать текстуру перед вызовом glDrawArrays. И все же у вашего кода есть проблема, о которой я упоминал. –

+0

Спасибо, поэтому мне нужно перестроить текстуру и включить ваше предложение. –

0

Я нашел решение, просто перевяжу текстуру кисти (текстуру для рисования свободного стиля) после рисования изображения. Рисование изображения свяжет другую текстуру с буфером, а затем продолжит рисовать свободный стиль, поскольку openGLES по-прежнему использует предыдущую текстуру связывания, в этом случае это изображение.

Смежные вопросы