2011-09-29 23 views
5

Tôi đang viết một trò chơi 3D đang sử dụng GL10, nhưng tôi muốn ứng dụng hỗ trợ GL11 hoặc GL20 nếu có. Thiết kế tốt nhất để hỗ trợ tất cả 3 là gì? Hay đây có phải là chuyện ngu ngốc và tôi chỉ nên tập trung hỗ trợ một phiên bản?Làm cách nào để hỗ trợ OpenGL ES GL10, GL11 và GL20 trong Libgdx?

Ý tưởng hiện tại của tôi là chia hàm render() của tôi thành renderGL10, renderGL11, renderGL20 và gọi hàm kết xuất phù hợp dựa trên cá thể GL có sẵn. Bên trong mỗi hàm render là cách thích hợp để render cho phiên bản GL; có khả năng sẽ chồng lên GL10 và GL11. Đây có phải là một cách thích hợp để xử lý vấn đề của tôi hoặc có cách nào tốt hơn không?

public render(){ 
    if (Gdx.graphics.isGL20Available()){ 
    renderGL20(); 
    } else if (Gdx.graphics.isGL11Available()){ 
    renderGL11(); 
    } else { 
    renderGL10(); 
    } 
} 

EDIT: Giải pháp: Nếu gl1.x có sẵn, gl10 cũng có sẵn (và Gdx.gl10 không phải là null). Vì vậy, làm cho mã của tôi nói chung nên được cấu trúc như sau:

public render(){ 
    // Use Gdx.gl for any gl calls common to all versions 
    if (Gdx.graphics.isGL20Available()){ 
    // Use Gdx.GL20 for all gl calls 
    } else { 
    if (Gdx.graphics.isGL11Available()){ 
     // Use Gdx.gl11 for any gl11 call not supported by gl10 
    } 
    // Use Gdx.gl10 for all gl calls 
    } 
} 

Trả lời

10

Bạn có thực sự sử dụng bóng đổ trên đường OpenGL ES 2.0 của bạn hay bạn dựa vào SpriteBatch và các phu nhân để xử lý các chi tiết bẩn cho bạn? Trong trường hợp sau, không có lợi ích thực sự khi sử dụng GLES 2.0 (ngoài việc không có hai họa tiết, có thể chậm hơn trên một số thiết bị). Nếu bạn đi với 1.x bạn không phải làm bất cứ điều gì. Nếu bạn muốn sử dụng 2.0, bạn phải tạo một AndroidApplicationConfig và đặt cờ useGL20 thành true. Nếu GLES 2.0 không được hỗ trợ trên thiết bị bạn chạy ứng dụng của bạn, libgdx sẽ quay trở lại 1.x. Sau đó bạn có thể sử dụng vòng lặp kết xuất ở trên của bạn sẽ sử dụng GLES 2.0 nếu có và quay lại 1.x nếu không. Bạn có thể không phải có đường dẫn riêng biệt cho 1,0 và 1.x mặc dù, trừ khi bạn sử dụng các cuộc gọi GLES trực tiếp.

+1

Tôi chưa sử dụng nhiều phần nghệ thuật của thư viện; Tôi đang khám phá cách tôi muốn thiết kế nó mà không cần nhiều kiến ​​thức về gles2.0 hoặc cách libgdx xử lý gl1.x. Tôi đang sử dụng trò chơi này để mở rộng kiến ​​thức về lập trình trò chơi và GLES, vì vậy tôi muốn hỗ trợ cả hai vì vậy tôi có thể cố gắng tìm hiểu GLSL. Dựa trên câu trả lời của bạn về 1.x, tôi chỉ cần xem nhanh nguồn gốc cho các phụ trợ Android và Jogl và nhận thấy rằng khi có sẵn gl11, Gdx.gl10 = Gdx.gl11; Tôi hy vọng rằng gl10 sẽ là null nếu gl11 được thiết lập (cùng một cách gl10 và gl11 là null khi 2.0 có sẵn). Điều này và câu trả lời của bạn thực sự hữu ích. – Doran

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