2012-02-03 7 views
5

Tôi đang xây dựng một trò chơi iOS với OpenGL ES 2.0 có chứa một cảnh với khoảng 100 'đối tượng' khác nhau mà tôi cần để có thể biến đổi độc lập với nhau. Tôi mới tham gia OpenGL ES. Như vậy, ban đầu tôi nghĩ tôi nên bắt đầu với OpenGL ES 1.1, sau đó di chuyển ứng dụng lên 2.0 để tận dụng các hiệu ứng hình ảnh nâng cao. Tuy nhiên, cũng giống như tôi đã cảm thấy thoải mái với 1,1, tôi nhận ra, một phần dựa trên mẫu Xcode 2.0 centric của Apple cho OpenGL, rằng nó sẽ gặp nhiều rắc rối hơn đáng để chiến đấu di chuyển thẳng vào 2.0, vì vậy Tôi cắn viên đạn.Làm cách nào để thao tác các đối tượng độc lập với nhau trong OpenGL ES 2.0?

Bây giờ, tôi thấy khó nắm bắt các khái niệm đủ để thực hiện các phép biến đổi đơn giản trên các đối tượng mảng đỉnh của tôi độc lập với nhau. Tôi đọc trong tài liệu OpenGLES 2.0 rằng cách tốt nhất để làm điều này sẽ là sử dụng nhiều VBO, một cho mỗi mảng đỉnh. Tuy nhiên, tôi dường như không thể biến đổi một trong số họ mà không ảnh hưởng đến toàn cảnh.

tôi bắt đầu dự án với các mẫu của Apple OpenGL ES và sắp xếp hợp lý, chẳng hạn rằng phương pháp setupGL trông như thế này:

-(void)setupGL 
{ 
    // Setup 
    [EAGLContext setCurrentContext:self.context];   
    [self loadShaders]; 
    self.effect = [[GLKBaseEffect alloc] init]; 
    self.effect.light0.enabled = GL_TRUE; 
    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 1.0f); 
    glEnable(GL_DEPTH_TEST); // do depth comparisons and update the depth buffer 

    // Initialize first buffer 
    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray);  
    glGenBuffers(1, &_vertexBuffer);  
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);  
    glBufferData(GL_ARRAY_BUFFER, sizeof(gPyramidVertexData), gPyramidVertexData, GL_DYNAMIC_DRAW); 
    glEnableVertexAttribArray(GLKVertexAttribPosition);  
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));  
    glBindVertexArrayOES(0); 

    // Initialize second buffer 
    glGenVertexArraysOES(2, &_vertexArray2); 
    glBindVertexArrayOES(_vertexArray2); 
    glGenBuffers(2, &_vertexBuffer2); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 
    glBindVertexArrayOES(0); 
} 

Tôi biết đó là vô cùng cẩu thả số- tôi về cơ bản sao chép và dán đệm tạo phần để thiết lập bản thân mình để thử nghiệm với hai vertextArrays khác nhau trong các bộ đệm riêng biệt. Nó dường như đã làm việc, như tôi có thể làm cho cả hai bộ đệm trong phương pháp drawInRect:

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glBindVertexArrayOES(_vertexArray); 
    glUseProgram(_program); 
    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);  
    glDrawArrays(GL_TRIANGLES, 0, numberOfVerteces); 

    glBindVertexArrayOES(_vertexArray2); 
    glUseProgram(_program); 
    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 
    glDrawArrays(GL_TRIANGLES, 0, numberOfVerteces2); 
} 

Vấn đề của tôi đến khi tôi cố gắng làm biến đổi trên một mảng đỉnh mà không ảnh hưởng một trong những khác. Tôi đã thử thêm biến đổi trong phương pháp trên ngay trước khi các cuộc gọi glDrawArrays, mà không thành công-Tôi nghĩ rằng chỉ có thể làm việc với 1.1. Nó xuất hiện biến đổi của tôi phải được thực hiện bên trong phương thức cập nhật:

-(void)update 
{ 
    float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);   
    self.effect.transform.projectionMatrix = projectionMatrix; 

    GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); 
    baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _sceneRotation, 1.0f, 1.0f, 1.0f); 

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, zoomFactor); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _objectRotation, 0.0f, 1.0f, 0.0f); 
    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); 

    _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); 
    _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);  
} 

Tuy nhiên, đây là nơi mà tôi nhận được thực sự confused-- nó không phải ở tất cả rõ ràng làm thế nào tôi có thể sửa đổi phương pháp này để làm biến đổi một VBO này hay cách khác . Nó thậm chí không rõ ràng rằng thứ ở trên mã là làm cho bất kỳ tham chiếu đến một bộ đệm cụ thể ở tất cả.

Cuối cùng, tôi muốn mở rộng trò chơi của mình bằng cách di chuyển mã cho từng đối tượng trò chơi vào một thể hiện của lớp tùy chỉnh, điều này sẽ xử lý các biến đổi, v.v. Nhưng tôi muốn biết tôi có hoàn toàn sai lầm trong tiếp cận trước khi làm như vậy.

Trả lời

4

Trong trường hợp điều này hữu ích cho bất kỳ ai gặp sự cố tương tự, tôi đã tìm thấy câu trả lời tôi đang tìm kiếm trên blog tuyệt vời của Ian Terrell, Games by Ian Terrell.

Cụ thể, this tutorial và mã mẫu đi kèm của nó chính xác là những gì tôi cần để nắm bắt chủ đề rất phức tạp này. Hi vọng điêu nay co ich!

+0

Vì vậy, ý tưởng có GLKViewController và sử dụng NSObject để đặt đối tượng? Mà sau đó cung cấp cho bạn khả năng thao tác mỗi NSObject .. –

+0

Vâng đó là cơ bản chính xác. Cuối cùng tôi đã tái cấu trúc tất cả các hình dạng của mình thành các NSObjects được đóng gói độc đáo, điều này làm cho chúng dễ dàng hơn nhiều khi làm việc. Hướng dẫn tôi liên kết ở trên là một khởi đầu tuyệt vời. – todd412

0

GLKMatrix4 _modelViewProjectionMatrix [5]; // Al inicio

Cập nhật En - (void) utiliza Phép chiếu GLKMatrix4Matrix = GLKMatrix4MakeOrtho (-1.0f, 1.0f, -1.0f/aspect, 1.0f/aspect, -10.0f, 10.0f);

for (int i=0; i<5;i++) { 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(i*0.2+ 0.3f, 0.0f, 0.0f); 
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, GLKMatrix4MakeZRotation(0.0 - _rotation)); 
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, GLKMatrix4MakeXRotation(0.0 - _rotation)); 
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, GLKMatrix4MakeYRotation(0.20 - _rotation)); 

    _modelViewProjectionMatrix[i] = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); 
}