Я пишу приложение, позволяющее рисовать свободный стиль (используя палец) и рисовать изображение. Я отправил одну из моих проблем в 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];
А теперь вопрос будет, если необходимо выполнить следующие действия:
- рисование свободного стиля (все еще отлично)
- Нанесение изображения (еще штраф)
- снова Рисунок свободного стиля (ПРОБЛЕМЫ БЫВАЕТ !!!)
Цвета номер 3 и 4 изменяются и кажется ужасным. Я полагаю, что это слилось или противоречило после рисования изображения. Нужно ли очищать буфер после рисования изображения.
Спасибо @KazukiSakamoto, я нашел решение, как и ваше. Идея такая же, она использует предыдущую текстуру. Итак, помимо вашего предложения, могу ли я повторно связать текстуру с рисунком –
Да, вы можете связать текстуру перед вызовом glDrawArrays. И все же у вашего кода есть проблема, о которой я упоминал. –
Спасибо, поэтому мне нужно перестроить текстуру и включить ваше предложение. –