2012-08-01 63 views
12

Tôi đang sử dụng PowerVR OpenGL ES 2 SDK để phát triển trò chơi của mình trên Windows với C++ sau đó tôi có thể chuyển nó sang android hoặc iphone.Cách chính xác để vẽ văn bản trong OpenGL ES 2

Mọi thứ đều ổn, nhưng bây giờ tôi bị kẹt với hiển thị văn bản. Tôi không thể tìm thấy bất kỳ hướng dẫn chi tiết nào về cách hiển thị văn bản (sử dụng phông chữ TTF hoặc bitmap) trong OpenGL ES 2.0 bằng cách sử dụng C++. Tôi đã tìm thấy nhiều chủ đề nói về hiển thị văn bản trên android hoặc iphone bằng cách sử dụng java hoặc mục tiêu-c (với một lần xem văn bản, surfaceview hoặc một số thứ blah blah) nhưng tôi không nghĩ đó là những gì tôi cần. Tôi cần một "giải pháp đa nền tảng". (Hoặc có thể là tôi sai vào thời điểm này?)

Sau một nghiên cứu nhỏ, tôi có giải pháp trong tâm trí tôi:

Load và ràng buộc bitmap font chữ texture ->Parse văn bản và tạo ra và ràng buộc mảng đỉnh, bản đồ kết cấu với mảng tia cực tím, ... ->Làm cho nó thành màn hình

Tôi chưa thử nghiệm nhưng tôi nghĩ rằng đó là vấn đề khi sử dụng giải pháp của tôi: Khi tôi muốn thay đổi văn bản (cho Ví dụ: Tôi đang làm cho một số điểm người dùng, hoặc một bộ đếm thời gian trên màn hình) Tôi phải tái liên kết mảng mảng và mảng uv, nó không phải một ý tưởng hay, đúng không?

Có cách nào tốt hơn để vẽ phông bitmap trên màn hình với OpenGL ES 2 không?

Trả lời

2

hiển thị văn bản là một trong những chủ đề mà hầu hết những người mới cần phải đối mặt sớm hay muộn trong thế giới thư viện 3D.

Có rất nhiều hướng dẫn trên Internet về hiển thị văn bản, nhiều sách nói về nó. Lời khuyên của tôi là nhìn xung quanh và cố gắng hiểu cách họ làm việc.

Phông TTF không phải là giải pháp khả thi vì trong kịch bản tính toán thời gian thực (như trò chơi trên máy tính), kỹ thuật dựa trên hình học của TTF là quá nhiều tài nguyên.

Một giải pháp rất phổ biến (ví dụ tôi sử dụng trong công cụ 3D PATRIA) là sử dụng bản đồ kết cấu chứa glyph của các ký tự khác nhau, sau đó logic ứng dụng của bạn cần xử lý văn bản -> cho texturing của quads đó sẽ soạn cuối cùng của bạn "trên màn hình văn bản".

bản vẽ không phải là một chủ đề đơn giản vì nó liên quan đến chủ đề như kerning/khoảng cách/văn bản khác nhau có kích thước, vv

Cố gắng đi theo liên kết này để hiểu tốt nhất chủ đề (nếu tôi không sai, tác giả này wiki là một thành viên tích cực của cộng đồng này).

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

4

Các giải pháp mà bạn đề cập là con đường để đi, và trên thực tế, nếu bạn sửa đổi văn bản của bạn, bạn sẽ phải tạo hình học đại diện cho nó, rồi gửi lại để OpenGL.

Bước giải trí này sẽ mất một thời gian, nhưng chắc chắn không quá nhiều.

Đối với render văn bản, vấn đề có hai thành phần chính:

  • tạo bản đồ kết cấu của bạn bitmap
  • vẽ văn bản sử dụng kết cấu này, xem xét các số liệu phông chữ (kích thước, kerning vv) và có thể chống răng cưa subpixel

Để tạo bản đồ kết cấu, bạn có thể tìm thấy mã số xung quanh (có thể sử dụng freetype) hoặc sử dụng công cụ hiện có (chẳng hạn như AngleCode's bmfont).

Để vẽ, có thể bạn sẽ muốn tung ra mã của riêng mình, dựa trên một số mã hiện có, vì có rất nhiều chi tiết để tìm kiếm văn bản đẹp. Để bắt đầu đau đầu, bạn có thể xem this article.

Một nguồn cảm hứng hiện đại tốt có thể là Nicolas Rougier's freetype-gl mã.

+0

Có ai có ví dụ Android OpenGL ES 2.0 hỗ trợ xoay không? – Burf2000

0

Cách thích hợp để vẽ văn bản trong một trò chơi là để sử dụng tập bản đồ kết cấu với glyphs chứa các lĩnh vực khoảng cách: https://www.mapbox.com/blog/text-signed-distance-fields/

Xem thêm giấy SIGGRAPH này từ Valve (những người sáng tạo của Half-Life và Portal) biến thể mô tả của kỹ thuật: http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Chất lượng văn bản dựa trên trường khoảng cách cao hơn nhiều so với văn bản dựa trên bitmap đơn giản. Nó cũng sử dụng ít bộ nhớ hơn vì trường khoảng cách nhỏ hơn biểu diễn bitmap đúng nguyên văn của phông chữ.

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