существует простой способ сделать это со строками (без кисти): просто используйте тест глубины (очистите буфер глубины, установите для функции func значение GL_NOT_EQUAL или оставьте значение GL_LESS), чтобы избежать рендеринга в одной и той же позиции дважды.Однако это не сработает с более сложными кистями.
Ваш код имеет несколько основных недостатков.Во-первых, если вы хотите выполнить рендеринг в текстуру с использованием FBO, вам нужно вызвать glFramebufferTexture2D (), прежде чем выполнять какой-либо рендеринг в буфер (поскольку эта функция сообщает OpenGL, что он должен направить вывод рендеринга в эту текстуру с этого момента,не копируй).Таким образом, порядок операций в touchesBegan становится следующим:
glGenRenderbuffersOES(1, &brushFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER_OES, brushFramebuffer);
// creates FBO
glGenRenderbuffers(1, &brushDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, brushDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rushDepthBuffer);
// creates and attaches RB for depth
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, bufferTexture, 0);
// attaches texture to render to. now we're ready.
Далее, вы не вызываете glTexImage2D () в touchesEnded, что стерло бы весь рендеринг, сделанный для этой текстуры до сих пор.Можно вызывать glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);но вам лучше переместить эту строку в раздел инициализации, где вы создаете bufferTexture.Чтобы прекратить рендеринг в кадровый буфер, достаточно просто вызвать:
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
Текстура содержит изображение, отображаемое при активном FBO, и рисунок возвращается на экран (кадровый буфер приложения).
Теперь,потому что вы рисовали с использованием brushTexture, вам нужно:
glBindTexture(GL_TEXTURE_2D, bufferTexture);
А затем вы просто отрисовываете полноэкранный квад:
CGFloat vertices[] = {0, 0,
backingWidth, 0,
backingWidth, backingHeight,
0, backingHeight};
CGFloat texCoords[] = {0, 0,
1, 0,
1, 1,
0, 1,};
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glDrawArrays(GL_QUADS, 0, 4);
И это все ...
ВrenderLineFromPoint () не требуется вызывать
glBindFramebufferOES(GL_FRAMEBUFFER_OES, brushFramebuffer);
, так как он уже был связан в touchesBegan.Но это не повредит.
И еще одна вещь - вы должны убедиться, что прикосновения Beg, TouchMoved и TouchEnded действительно идут в таком порядке.Я не уверен, что это гарантировано.