2013-03-21 35 views
9

nềnOpenGL phương pháp văn bản vẽ và thương mại-offs

tôi làm việc trên các trò chơi Bitfighter. Chúng tôi vẫn tương thích với OpenGL 1.1 và biên dịch cho OSX, Windows và Linux.

Chúng tôi sử dụng đồ họa vector cho mọi thứ, bao gồm hiển thị văn bản và thao tác. Chúng tôi sử dụng biến thể được sửa đổi một chút của 'FontStrokeRoman' từ GLUT, đây chỉ là một loạt các dòng tĩnh. Chúng tôi thích điều này vì nó có vẻ hoạt động rất tốt, dễ xoay/quy mô/thao tác. Chúng tôi cũng cho phép trò chuyện trong trò chơi để văn bản được vẽ khi đang di chuyển.

Vấn đề

Chúng tôi muốn sử dụng phông chữ hơn/khác nhau.

Chúng tôi đã tìm thấy một số phông chữ khác mà chúng tôi thích, nhưng tất cả chúng đều là phông chữ kiểu TTF được tạo thành đa giác (có đường cong, v.v.) thay vì nét hoặc gai. Này sẽ trả về một vài vấn đề:

  • Chúng tôi sẽ phải sử dụng kết cấu (mà chúng tôi đã tránh được cho đến nay trong trò chơi)
  • Họ không dễ dàng thay đổi kích thước/xoay/etc.
  • Hiệu suất là ít hơn đáng kể (trên lý thuyết?)

Chúng tôi đã thử nghiệm chuyển đổi phông chữ TTF mảng điểm đa giác và sau đó triangulating điền. Tuy nhiên, điều này đã gây khó khăn cho việc hiển thị gợi ý/chống răng cưa độc đáo - có vẻ khó thực hiện trong trường hợp này.

Chúng tôi thậm chí còn thử nghiệm với các khung hình đa giác bằng cách sử dụng các thư viện như 'campskeleton', vì vậy chúng tôi có thể xuất ra một phông chữ vector-stroke (với nhiều thành công không tốt).

Chúng ta nên làm gì?

Tôi biết câu hỏi này có phần chung chung. Chúng tôi muốn giữ hiệu suất thao tác và văn bản nhưng có thể sử dụng phông chữ tốt hơn. Tôi mở cho bất kỳ đề xuất nào theo bất kỳ hướng nào.

Một số giải pháp có thể là câu trả lời như sau:

  • Làm thế nào để chúng ta đúng anti-alias văn bản đa giác dựa trên và vẫn giữ hiệu suất?
  • Làm họa tiết thực sự có hoạt động kém hơn mảng điểm tĩnh không? Có lẽ tôi có một giả thiết bị lỗi
  • Phông chữ có thể được định cấu trúc được thay đổi kích thước/xoay một cách nhanh chóng?
  • Có điều gì đó hoàn toàn khác?
+0

Tôi có thể quan tâm đến việc xem xét vấn đề này. Bạn có thể đặt một số ví dụ về: 1) một trong các phông chữ hiện tại của bạn và cách mã hóa của nó trông giống như, 2) một trong các phông chữ bạn muốn sử dụng, 3) tùy chọn, ví dụ về các thử nghiệm không thành công của bạn. – meyumer

+0

Phông chữ hiện tại của chúng tôi xuất phát từ GLUT. Nguồn: http://code.google.com/p/bitfighter/source/browse/zap/FontStrokeRoman.h. Chúng tôi muốn sử dụng orbitron: https://github.com/theleagueof/orbitron. Tôi không có một số thí nghiệm trên tôi vào lúc này. Một trong những nhà phát triển khác Watusimoto) có kết quả đầu ra của mọi thứ trên máy tính của mình – raptor

+3

Quadured kết cấu là như vậy, nhanh hơn rất nhiều khi hiển thị văn bản phẳng trong OpenGL. Sử dụng libfreetype2; nó rất dễ dàng, sẽ tạo ra kết quả chất lượng cao và sẽ có hiệu suất cao hơn (với kết cấu atlases) so với glyphs đa giác chưa được kết cấu. Không thể vẽ văn bản có dấu vân tay chống bí danh hoặc (lordy) chất lượng theo cách bạn đang làm. –

Trả lời

4

Sau khi một số thuyết phục (nhờ Serge) và cố gắng ra một số những gợi ý ở đây (bao gồm cả FTGL sử dụng freetype), chúng tôi đã giải quyết trên:

Font-Stash trong đó sử dụng stb_truetype

Điều này dường như hoàn hảo cho trò chơi của chúng tôi. Hiệu suất hiển thị được so sánh với phông chữ đột quỵ dựa trên vectơ mà chúng tôi đã sử dụng - các khung hình kết cấu thực sự không phải là chậm, một khi được tạo và bộ nhớ đệm từ Font-Stash giúp vô cùng. Ngoài ra, việc sử dụng stb_truetype cho phép chúng tôi không yêu cầu một phụ thuộc khác trong trò chơi trên tất cả các nền tảng.

Đối với giá trị của nó, giải pháp này là khoảng một đơn vị cường độ nhanh hơn so với sử dụng FTGL cho phông chữ đúng loại, có lẽ do bộ nhớ đệm.

Cảm ơn các đề xuất và gợi ý.

+0

Nó cũng có chức năng ít hơn nhiều so với một số giải pháp khác, vì vậy nó có thể không dành cho tất cả mọi người. Nhưng nó hoàn hảo cho Bitfighter! – Watusimoto

+0

Tôi hoàn toàn ngạc nhiên bởi Font-Stash! Chính xác những gì tôi đang tìm kiếm. Sau khi hủy liên kết chương trình đổ bóng và bộ đệm mảng, nếu hoạt động tốt ngay cả trong ngữ cảnh OpenGL 4+. – shinjin

1

Tôi không có chuyên gia về OpenGL hoặc chuyên gia đồ họa nói chung. Và, thực sự, Raptor, tôi - là anh chàng nói điều này, bởi vì tôi biết bạn cảm thấy như thế nào ngay bây giờ.

Tôi thực sự ghét phải nói điều đó, nhưng thành thật mà nói, tôi chỉ cần cung cấp cho phông chữ TTF một shot, sử dụng kết cấu và đa giác của chúng như chúng được dự định. Tôi nghi ngờ rằng việc sử dụng như vậy sẽ thực sự có hại cho hiệu suất của bạn những ngày này.Nó có thể có giá trị hơn để tiết kiệm thời gian để sử dụng chúng như là, thay vì dành thời gian để thử nghiệm xung quanh cho một số giải pháp thông minh phù hợp hơn với mong muốn của bạn.

Tôi nghi ngờ rằng bản vẽ văn bản sử dụng đa giác/họa tiết sẽ gây bất lợi, cho dù bạn có thực hiện hay không. Điều này đặc biệt áp dụng cho các máy tính ngày nay. Bao nhiêu năm trước, về công nghệ, bạn có dự định hỗ trợ ứng dụng của mình không? Hoặc có lẽ bạn muốn chạy nó trên Raspberry PI là tốt? Hoặc các nền tảng di động khác không có khả năng đồ họa cao? Hỗ trợ bất kỳ trong số này có thể, có thể, vô hiệu hóa yêu sách của tôi.

Nhưng, như tôi đã nói, tôi thực sự ghét phải là anh chàng gợi ý bạn trườn về phía trước. Bởi vì, tôi đã ở đó, yêu cầu lời khuyên về hiệu suất (đôi khi thậm chí còn nhiều thứ hơn) và chỉ rên rỉ khi ai đó nói 'quên nó đi, trình biên dịch sẽ xử lý nó' hoặc 'máy tính quá tiên tiến, bạn không nên lo lắng về nó' . Tôi thành thật hy vọng rằng một người khác đến với kinh nghiệm, và một câu trả lời tốt cho bạn. Tuy nhiên, nếu không, tôi chỉ muốn cho bạn biết: Tôi không thể thấy trước khả năng sử dụng TTF, như dự định, sẽ gây bất lợi cho hiệu suất chơi trò chơi của bạn.

+0

Đừng lo lắng về việc 'anh chàng đó' .. Tôi đã mong đợi nó :) – raptor

+0

"Sẽ rất có giá trị để tiết kiệm thời gian sử dụng chúng, thay vì dành thời gian để thử nghiệm một số giải pháp thông minh phù hợp hơn mong muốn của bạn. " Lời khuyên tốt, nhưng waaaaaay quá muộn! :-) – Watusimoto

1

Bạn đã thử phân tích đường viền glyph bằng cách sử dụng freetype FT_Outline_Decompose? Freetype là công cụ được lựa chọn để hiển thị phông chữ và trích xuất phác thảo glyph. Hinting được hỗ trợ và các chế độ hiển thị cho phép bạn chỉ định rằng bạn muốn antialiazing, hinting, monochrome targets…

Freetype cũng có cơ chế cache glyph/bitmaps có thể hữu ích.

Lưu ý: OGFLT dường như thu hẹp khoảng cách giữa freetype và OpenGL mặc dù tôi chưa bao giờ có cơ hội để sử dụng nó

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