我想渲染一个VBO数组,但结果不正确。当我第一次使用GLPaint(OpenGLES v2)设置绘制它们时,我将它们保存到一个数组中。如果你想帮助我,这里是我有的示例项目。 https://drive.google.com/file/d/0B0pG5vRVzBTzUTZPYWNoenhkcWs/edit?usp=sharing渲染顶点缓冲区阵列OenGL ES2
////// Store VBOs when drawing this is done in renderLineFromPoint (from GLPaint)
- (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end
{
static GLfloat* vertexBuffer = NULL;
static NSUInteger vertexMax = 64;
NSUInteger vertexCount = 0,
count,
i;
[EAGLContext setCurrentContext:context];
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
// Convert locations from Points to Pixels
CGFloat scale = self.contentScaleFactor;
start.x *= scale;
start.y *= scale;
end.x *= scale;
end.y *= scale;
// Allocate vertex array buffer
if(vertexBuffer == NULL)
vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));
// Add points to the buffer so there are drawing points every X pixels
count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y))/kBrushPixelStep), 1);
for(i = 0; i < count; ++i)
{
if(vertexCount == vertexMax)
{
vertexMax = 2 * vertexMax;
vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
}
vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count);
vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count);
vertexCount += 1;
}
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);
// Render the vertex array
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
glDrawArrays(GL_POINTS, 0, vertexCount);
// Display the buffer
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];
// Store VBO for undo
VBOHolder *vboHolder = [[VBOHolder alloc]init];
vboHolder.vertexCount = vertexCount;
vboHolder.vbo = vertexBuffer;
[vboHolderArray addObject:vboHolder];
}
////// Here is the problem: I clear the screen and then try to re-render the VBOs
-(void)renderSavedVertexBufferes
{
for (VBOHolderModel *vboh in vboHolderArray)
{
if (vboh.vertexCount == 0)
{
continue;
}
NSUInteger vertexCount = vboh.vertexCount;
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, vertexCount*2*sizeof(GLfloat), vboh.vbo, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Render the vertex array
glVertexPointer(2, GL_FLOAT, 0, vboh.vbo);
glDrawArrays(GL_POINTS, 0, vertexCount);
// Display the buffer
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];
}
}
////// VBOHolderModel looks like this, it wraps the vbo so it can be put in NSMutableArray
@interface VBOHolderModel : NSObject
{
GLfloat *vbo;
NSUInteger vertexCount;
}
它基本上是一个撤消...当按下撤消它应该只删除3,因为这是最后一搏,但删除了一切,并绘制第二图像中显示的点。
撤销应该使用智能设计模式来处理,而不是任何API特定的功能。如果我是你,我会研究这个备忘录设计模式,这将允许您将文档存储为一系列命令,其中每个命令都存储以前的状态。当需要渲染文档时,您可以像所有命令一样重播。当需要撤销命令时,您可以使用先前状态的副本(快速但内存不足),也可以按顺序重播命令。 –
这是回应你之前的问题;关于* this *问题,我不得不想知道为什么一个名为'SavedVertexBufferes'的函数在每次被调用时都会向VBO发送新数据?如果情况确实如此,它确实不会保存任何东西。我会考虑使用顶点数组对象,因为这是iOS特定的 - 并不是所有的GL ES 2.0实现都支持它们,但iOS可以。 –
你指的是renderSavedVertexBufferes函数吗?如果是这样,那就是我正在试图重绘已经绘制并存储在数组中的顶点缓冲区。然后我在该数组中创建一个标志,让我知道最后一行的绘制时间,然后我可以删除顶点缓冲区,然后重绘剩余的缓冲区,这基本上是一个“撤消”。但我仍然不赞成维也纳国际中心的工作方式或OpenGL ES。我需要一个很好的图解来解释所有部分之间的关系。 –