Cách ưa thích để hiển thị văn bản trong OpenGL [đã đóng]


17

Tôi sắp lấy đồ họa máy tính một lần nữa cho một dự án đại học. Đối với một dự án trước đây, tôi đã sử dụng một thư viện có tên FTGL , điều đó không làm tôi khá hài lòng vì nó cảm thấy nặng nề (tôi đã thử rất nhiều kỹ thuật kết xuất, kết xuất văn bản không có quy mô rất tốt).

Câu hỏi của tôi là, có một thư viện tốt và hiệu quả cho việc này? Nếu không, cách nào để thực hiện văn bản nhanh nhưng đẹp? Một số mục đích sử dụng là:

  • Nhãn đối tượng / ký tự nổi
  • Đối thoại
  • Thực đơn
  • HUD

EDIT: Tốt nhất là nó cũng có thể tải phông chữ


1
Đây là "câu hỏi nên sử dụng công nghệ nào" và do đó có lẽ nên đóng lại.
Laurent Couvidou

Câu trả lời:


4

Một khung phổ biến là GUI của Crazy Eddie .

Nhưng trong khi đó là hấp dẫn, nó không phải là bất thường để cuộn của riêng bạn (và có lẽ hối tiếc vì phạm vi tăng sau này;))

Nó là bình thường để có glyphs của bạn trên bitmap và sau đó vẽ bitmap bằng OpenGL.

Đôi khi bạn hiển thị văn bản thoáng qua có thể chỉ xuất hiện cho một số ít khung. Chỉ cần sử dụng GL_QUADS + glVertex là đủ. Nhưng đối với bất kỳ số lượng lớn văn bản hoặc bất kỳ thời gian hiển thị dài nào cũng đáng để đưa GL_QUADS vào VBO - Tôi đã nhận thấy những cải tiến hiệu suất lớn từ điều này.

Tất nhiên có câu hỏi về việc tạo ra glyphs thực tế mà bạn cần. Có những chương trình như bmfont mà bạn có thể sử dụng cho điều đó. Hoặc bạn có thể cần kết xuất phức tạp hơn, ví dụ như freetype theo yêu cầu. Tôi đã sử dụng bmfont với trình kết xuất của riêng tôi khá vui vẻ, rất đơn giản để suy luận.


9

Có rất nhiều cách - tùy thuộc vào những gì bạn muốn ... Giống như mọi nơi khác, không có gì giống như "giải pháp tốt nhất". Plattform nào là mục tiêu của bạn? Bạn đang sử dụng ngôn ngữ nào Điều gì về thay đổi kích thước văn bản / xoay - có cần thiết không? Bạn có cần hiển thị TrueTypeFonts không? Có gì về đa ngôn ngữ / Unicode? Làm thế nào để bạn muốn lưu trữ văn bản của bạn (mã hóa, vv)?

Trước đây tôi cũng đã sử dụng FTGL, cũng như freetype thuần túy (http://www.freetype.org/ FTGL dựa trên điều này), các loại phông chữ bitmap khác nhau, phông chữ phác thảo ... Bây giờ tôi hầu như nghiện bitmap phông chữ, nhưng đó chỉ là sở thích cá nhân của tôi. Bởi vì tôi không muốn đối phó với các bộ ký tự khác nhau, mã hóa và những thứ tương tự nữa - và việc cấp phép cho bitmapfonts cũng dễ dàng hơn và rẻ hơn so với TrueTypeFonts. Và nó có thể sử dụng trên mọi plattform có thể tải hình ảnh. Tôi chỉ đơn giản sử dụng một quad trong openGL và ánh xạ một phần kết cấu của tôi lên nó. Mặt khác là: Phông chữ sẽ chỉ có thể thay đổi kích thước sạch ở hệ số khoảng +/- 50%. Nếu bạn có thể sống với điều đó, tôi sẽ đề nghị sử dụng bitmapfont.

Nếu bạn cũng phải đối phó với các bảng mã / bảng mã khác nhau, bạn nên tìm cách tải và sử dụng TrueTypeFonts (như với freetype, sử dụng thư viện khác hoặc với sự cấy ghép của riêng bạn) ...

Cũng có một cái nhìn về các hướng dẫn khác nhau về chủ đề này:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Phông chữ Bitmap

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Phông chữ phác thảo

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Phông chữ phác thảo kết cấu

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Phông chữ kết cấu 2D

Chúc may mắn!


+1 Cảm ơn thông tin có giá trị về hiệu suất, tôi đã biết về hướng dẫn của NeHe. Tôi nghĩ rằng tôi đã sử dụng phông chữ bitmap ... nhưng nó không có tỷ lệ: khoảng 60 nhãn nổi trong một cảnh trên các hình cầu được nối bởi các đường, có cái nhìn sâu sắc nào về điều đó không? (Tôi đã nghĩ rằng tôi nên tìm kiếm một cách để thực hiện một mô hình bay
bổng

1
Thận trọng: Các hướng dẫn của NeHe dành cho đường ống chức năng cố định cũ và không được cập nhật thường xuyên. Nếu bạn đang tìm kiếm một giải pháp OpenGL see hiện đại stackoverflow.com/questions/5262951/...
brita_

6

Nếu bạn muốn sử dụng phông chữ bitmap, bạn không thể sai nhiều với Trình tạo phông chữ Angelmap Bitmap: http://www.angelcode.com/products/bmfont/

Nó chuyển đổi phông chữ truetype thành một hoặc nhiều kết cấu (với glyphs được đóng gói độc đáo) và xuất ra một tệp nhỏ chứa UV và khoảng cách (Tôi thấy rằng đầu ra XML đặc biệt dễ làm việc và chất lượng của dữ liệu khoảng cách nói chung rất tốt, thậm chí không có sự khôn ngoan thực sự)


1

Tôi đang sử dụng các thư viện của Sean Barret để hiển thị truetype-glyphs trong OpenGL (stb_image, stb_truetype).

Dự án Recast / Detour đang sử dụng các thư viện này để tạo giao diện người dùng ( IMUI )


0

Hãy xem xét QML . Đó là một thư viện UI đầy đủ chức năng với cú pháp dễ sử dụng. Bộ tính năng của nó tốt hơn đáng kể so với CEGUI theo kinh nghiệm của tôi và nó có tài liệu, hỗ trợ và cộng đồng tốt hơn vì mục tiêu chính của nó là các ứng dụng trên máy tính để bàn và khả năng hiển thị ngoài màn hình chỉ là một phần thưởng.

Ưu điểm:

  • Nó sử dụng OpenGL ở mặt sau cho tất cả kết xuất
  • Nó có thể tải bất kỳ phông chữ nào có sẵn cho hệ thống máy chủ và cũng có thể phân tích các phông chữ bổ sung mà bạn đưa vào làm tài nguyên
  • Nó sử dụng kết xuất văn bản trường khoảng cách đã ký để đầu ra hiệu quả và chất lượng cao
  • Nó có thể kết xuất trực tiếp đến kết cấu OpenGL, vì vậy bạn có thể dễ dàng đặt kết quả vào môi trường trò chơi của mình
  • Qt có rất nhiều ràng buộc ngôn ngữ

Nhược điểm:

  • Qt là một khuôn khổ lớn
  • Sử dụng QML trong các dự án Direct3D hoặc Vulkan đòi hỏi phải nhảy qua các vòng để đưa kết cấu GL vào API thích hợp (hoặc chờ ai đó viết trình kết xuất D3D / Vulkan gốc cho QML)
  • Vẫn còn một số vấn đề nhỏ trong QML, nơi nó sẽ cố gắng sử dụng điều khiển riêng ngay cả khi bạn đang hiển thị trên bề mặt ngoài màn hình, như khi bạn cố gắng mở ra một danh sách thả xuống cho một mục danh sách.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.