tôi đang viết một ứng dụng đơn giản cho iphone có hiển thị khối lập phương xoay. Tôi đang sử dụng glDrawElements (openGl es) để vẽ hình tam giác của hình khối và xoay nó. Tôi đã nhận thấy rằng khi tôi tăng kích thước của khối lập phương lên 100 * 100 * 100 voxels, hiệu suất hiển thị bị kém (làm rõ: tôi không vẽ toàn bộ khối lập phương, tôi vẽ chỉ là đường viền của nó (lưới). của lưới bằng cách áp dụng các thuật toán khối diễu hành trên khối lập phương ... cuối cùng tôi nhận được một cái gì đó giống như tam giác 120k để vẽ được đại diện bởi 40k đỉnh) ...Sử dụng đối tượng đệm Vertex (VBO) trong OpenGL es (Iphone) để cải thiện hiệu suất
Để vẽ khối i giữ một mảng đỉnh, mảng màu sắc và mảng nếu các chỉ mục cho các đỉnh. Mảng chỉ số xác định các tam giác của các đỉnh được vẽ. Nó được chuyển tới glDrawElements như một tham số.
Gần đây tôi đã có màu đỏ về một kỹ thuật khác để vẽ hình khối bằng cách sử dụng Đối tượng đệm Vertex (VBO). Tôi đã thực hiện nó, nhưng hiệu suất đã Thậm chí worser sau đó bằng kỹ thuật trước
Dưới đây là mã của tôi, có lẽ tôi đã thực hiện một sai lầm ngớ ngẩn, Bất kỳ đề xuất cải tiến sẽ được đón nhận nồng nhiệt :)
bằng cách này, tôi sử dụng các bài viết sau đây là tài liệu tham khảo:
http://playcontrol.net/ewing/jibberjabber/opengl_vertex_buffer_object.html http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-table-of.html
//all the 7 variables down are initialized by other function at the beginning
GLushort* meshIndices; //array of indices (ushort)
MeshVertex* meshVertices; //array of vertices (floats)
Color3D* meshColors; //array of colors (floats)
int numberOfTriangles; //number of Triangle to draw the cube
int numberOfVertices; //number of all Vertices to draw the cube
int numberOfIndices; //number of all Indices to draw the cube, each 3 indices define 3 vertices which define 1 triangle
int numberOfColors; //number of colors used to draw the cube. each color is of tip Color3D
//in this function i initializing the VBOs
- (void) setupMeshVBOs {
glGenBuffers(1, &triangleVBO);
glBindBuffer(GL_ARRAY_BUFFER, triangleVBO);
const GLsizeiptr vertex_size = numberOfVertices * sizeof(MeshVertex);
const GLsizeiptr color_size = numberOfColors * sizeof(Color3D);
glBufferData(GL_ARRAY_BUFFER, vertex_size + color_size, 0, GL_STATIC_DRAW);
GLvoid* vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, meshVertices, vertex_size);
GLbyte* temp = (GLbyte*)vbo_buffer;
temp += vertex_size;
memcpy((GLvoid*)temp, meshColors, color_size);
glUnmapBufferOES(GL_ARRAY_BUFFER);
glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)((char*)NULL));
glColorPointer(4, GL_FLOAT, 0, (GLvoid*)((char*)NULL+vertex_size));
glGenBuffers(1, &triangleIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, triangleIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numberOfIndices * sizeof(GLushort), meshIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
//this function is the one which draws the VBOs
- (void)drawView:(GLView*)view;
{
static GLfloat rot = 0.0;
glLoadIdentity();
glTranslatef(-1.0f,-2.0f,-20.0f);
glRotatef(rot,1.0f,1.0f,1.0f);
glClearColor(0.7, 0.7, 0.7, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, triangleVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, triangleIBO);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawElements(GL_TRIANGLE_STRIP, numberOfIndices, GL_UNSIGNED_SHORT, (GLvoid*)((char*)NULL));
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
static NSTimeInterval lastDrawTime;
if (lastDrawTime)
{
NSTimeInterval timeSinceLastDraw = [NSDate timeIntervalSinceReferenceDate] - lastDrawTime;
rot+=50 * timeSinceLastDraw;
}
lastDrawTime = [NSDate timeIntervalSinceReferenceDate];
}
Trước hết, bạn nói ở 100^3 voxels hiệu suất trở nên tồi tệ. Đó không phải là một bất ngờ ở tất cả, vì đó sẽ là 1 triệu voxels. Tôi giả sử rằng mỗi voxel là một khối lập phương, bao gồm 12 hình tam giác. Đó sẽ là 12 triệu hình tam giác trên mỗi lần gọi. Đó là rất nhiều*. Cũng lưu ý rằng các VBO * có thể * hiệu quả hơn khi dữ liệu màu sắc và đỉnh được xen kẽ. Tuy nhiên, đối với iPhone (PowerVR) tôi không biết nếu đó là trường hợp. – Arne
vâng, tôi đã không giải thích về bản thân mình, tôi đã chỉnh sửa câu hỏi cho phù hợp. Khối lập phương là 100 * 100 * 100 nhưng tôi không vẽ toàn bộ khối lập phương, tôi vẽ chỉ đường viền của nó (lưới). Tôi nhận được tất cả các hình tam giác của lưới bằng cách áp dụng các thuật toán khối diễu hành trên khối lập phương ... cuối cùng tôi nhận được một cái gì đó giống như tam giác 120k để vẽ được đại diện bởi 40k đỉnh ... – alexpov