2011-09-06 37 views
8

Tôi đang cố chuyển đổi ứng dụng OpenGL ES 1 của mình thành ứng dụng OpenGL ES 2 để có thể sử dụng Shaders. Bây giờ tôi sử dụng chức năng glOrthof để có một "khung nhìn có kích thước thực" vì vậy tôi có thể đặt các đỉnh tại điểm ảnh "thực tế" trong Chế độ xem OpenGL.Cách đạt được glOrthof trong OpenGL ES 2.0

glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1); 

Tôi gặp khó khăn khi tìm hiểu cách đạt được điều này trong OpenGL ES 2, có ai có thể chỉ cho tôi cách thực hiện việc này không?

Nếu không, có ai có liên kết đến hướng dẫn/giải thích tốt OpenGL ES 1 to OpenGL ES 2 không?

Trả lời

12

Phương thức glOrtho không có gì khác ngoài việc tạo ma trận mới và nhân ma trận chiếu hiện tại bằng ma trận này. Với OpenGL ES 2.0, bạn phải tự quản lý ma trận. Để tái tạo hành vi glOrtho, bạn cần đồng phục cho ma trận chiếu trong bóng đổ đỉnh của bạn, sau đó bạn nhân các đỉnh của mình với. Thông thường, bạn cũng có một mô hình và một ma trận điểm (hoặc một ma trận modelview kết hợp, như trong OpenGL ES 1) mà bạn chuyển đổi các đỉnh của bạn với trước khi chiếu transform:

uniform mat4 projection; 
uniform mat4 modelview; 

attribute vec4 vertex; 

void main() 
{ 
    gl_Position = projection * (modelview * vertex); 
} 

Ma trận dự báo cụ thể mà glOrtho cấu trúc có thể được tìm thấy here.

+0

Bạn có thể chỉ cho tôi cách tạo/tải phép chiếu và chế độ xem mô hình không? – Thys

+0

@MrThys Nếu bạn không chắc chắn về điều đó, trước tiên bạn nên tham khảo ý kiến ​​một số tài nguyên học tập về các trình đổ bóng OpenGL ES 2.0 và GLSL. Về cơ bản, một khi bạn có các vị trí thống nhất tương ứng và chương trình đổ bóng bị ràng buộc/sử dụng, bạn có thể đặt giá trị của chúng với một trong nhiều ['glUniform ...'] (http://www.opengl.org/sdk/docs /man/xhtml/glUniform.xml) gọi, trong trường hợp ma trận bạn sử dụng 'glUniformMatrix4fv' –

+0

Các liên kết đã chết ... – B0rk4

10

Như Christian mô tả, tất cả phép tính ma trận để xử lý đỉnh của bạn tùy thuộc vào bạn, vì vậy bạn phải sao chép ma trận mà glOrthof() tạo ra. Trong câu trả lời của tôi here, tôi cung cấp các phương pháp Objective-C sau đây để tạo ra như một ma trận chiếu chính tả:

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far; 
{ 
    GLfloat r_l = right - left; 
    GLfloat t_b = top - bottom; 
    GLfloat f_n = far - near; 
    GLfloat tx = - (right + left)/(right - left); 
    GLfloat ty = - (top + bottom)/(top - bottom); 
    GLfloat tz = - (far + near)/(far - near); 

    matrix[0] = 2.0f/r_l; 
    matrix[1] = 0.0f; 
    matrix[2] = 0.0f; 
    matrix[3] = tx; 

    matrix[4] = 0.0f; 
    matrix[5] = 2.0f/t_b; 
    matrix[6] = 0.0f; 
    matrix[7] = ty; 

    matrix[8] = 0.0f; 
    matrix[9] = 0.0f; 
    matrix[10] = 2.0f/f_n; 
    matrix[11] = tz; 

    matrix[12] = 0.0f; 
    matrix[13] = 0.0f; 
    matrix[14] = 0.0f; 
    matrix[15] = 1.0f; 
} 

Ma trận sử dụng ở đây được định nghĩa là

GLfloat orthographicMatrix[16]; 

sau đó tôi áp dụng các ma trận trong vòng đỉnh của tôi shader sử dụng một cái gì đó như sau:

gl_Position = modelViewProjMatrix * position * orthographicMatrix; 

Thứ tự nhân của tôi khác với Christian, vì vậy tôi có thể làm điều gì đó một chút trở lại ward ở đây, nhưng đây là những gì tôi đã sử dụng để xử lý này trong một ứng dụng OpenGL ES 2.0 của tôi (mã nguồn trong đó có thể được tìm thấy here).

+0

Phương pháp của bạn có vẻ khớp chính xác với công thức được đưa ra bởi trang người dùng glOrthof (ví dụ: http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml) – Tommy

+2

Ma trận chỉnh hình thực sự là ma trận chiếu, nhưng tên 'modelViewProjMatrix' gợi ý rằng bạn có một ma trận chiếu khác, điều này hơi lạ một cách khái niệm (mặc dù hợp lệ, những gì không thể có với các trình đổ bóng). Nhưng điều thực sự lạ là bạn trộn ứng dụng bên trái với việc áp dụng đúng các phép biến đổi ma trận thành các vectơ. Và đó là lý do bạn thực sự tạo ma trận transposed trong thói quen 'loadOrthoMatrix' của bạn (và lý do tại sao mã shader này sẽ gây ra sự nhầm lẫn hoàn toàn với bất kỳ ai không phải là sâu vào biến đổi ma trận). –

+0

@Christian - Bạn thực sự có thể nói rằng ma trận toán học không phải là một trong những lĩnh vực mạnh mẽ của tôi. Việc đặt tên cho trình đổ bóng được để lại từ một triển khai khác, và thực sự chỉ nên là ma trận khung nhìn mô hình cho thành phần đầu tiên. Tôi nhận ra rằng đây là trường hợp của hai người cho vay, nhưng nó đã làm việc khi tôi thử nó nên tôi chưa bao giờ hỏi tại sao. Cảm ơn bạn đã chỉ ra những điều kỳ quặc ở đây. –

Các vấn đề liên quan