Рисование конфликтов на OpenGLES на iOS

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

У меня есть 2 программы, которые имеют идентификатор 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);
}

---- текстура.vsh --------

attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;

varying vec2 v_TextureCoordinates;

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

---- texture.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];

И теперь проблема возникает, если я делаю следующие шаги:

  • Рисование в свободном стиле (все еще в порядке)

Все еще хорошо

  • Рисование изображения (все еще в порядке)

Все еще хорошо

  • Снова рисуя свободный стиль (ПРОБЛЕМА СЛУЧАЕТСЯ!!!)

ПРОБЛЕМА

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

2 ответа

Решение

Фрагмент шейдера point.fsh использует текстуру, но ваш код GL "Стиль без рисования" не имеет glBindTexture. Поэтому он будет использовать последнюю текстуру glBindTexture.

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

glEnableVertexAttribArray(ATTRIB_VERTEX)

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

glEnableVertexAttribArray(a_position_location);
glEnableVertexAttribArray(a_texture_coordinates_location);

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

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

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

Другие вопросы по тегам