Trạng thái hiện đại để hiển thị văn bản trong OpenGL như phiên bản 4.1 là gì? [đóng cửa]


199

Đã có một số câu hỏi về kết xuất văn bản trong OpenGL, chẳng hạn như:

Nhưng chủ yếu những gì được thảo luận là kết xuất các quads có kết cấu bằng cách sử dụng đường ống chức năng cố định. Chắc chắn shader phải làm một cách tốt hơn.

Tôi không thực sự quan tâm đến việc quốc tế hóa, hầu hết các chuỗi của tôi sẽ là các nhãn đánh dấu lô (ngày và giờ hoặc hoàn toàn là số). Nhưng các ô sẽ được kết xuất lại ở tốc độ làm mới màn hình và có thể có khá nhiều văn bản (không quá vài nghìn glyph trên màn hình, nhưng đủ để bố cục tăng tốc phần cứng sẽ tốt).

Cách tiếp cận được đề xuất cho kết xuất văn bản bằng OpenGL hiện đại là gì? (Trích dẫn phần mềm hiện có bằng cách sử dụng phương pháp này là bằng chứng tốt cho thấy nó hoạt động tốt)

  • Các shader hình học chấp nhận ví dụ như vị trí và hướng và một chuỗi ký tự và phát ra các hình tứ giác
  • Các shader hình học làm cho phông chữ vector
  • Như trên, nhưng sử dụng shader tessname thay thế
  • Một shader tính toán để thực hiện rasterization phông chữ

10
Tôi không thể trả lời về tình trạng hiện đại, chủ yếu là định hướng OpenGL ES hiện nay, nhưng việc xác định một TTF bằng cách sử dụng bộ điều khiển GLU và gửi nó dưới dạng hình học thông qua đường ống chức năng cố định cũ với tính toán tiên tiến trên CPU cho kết quả trực quan tốt về khả năng chống -chuyển đổi phần cứng và hiệu suất tốt trên bảng thậm chí gần một thập kỷ trước. Vì vậy, không chỉ với các shader mà bạn có thể tìm thấy một cách 'tốt hơn' (tất nhiên phụ thuộc vào tiêu chí của bạn). FreeType có thể nhổ ra ranh giới và thông tin tiên tiến của Bezier, vì vậy bạn có thể làm việc trực tiếp từ TTF khi chạy.
Tommy

QML2 (của Qt5) thực hiện một số thủ thuật thú vị với OpenGL và các trường khoảng cách khi kết xuất văn bản: blog.qt.digia.com/blog/2012/08/08/native-looking-text-in-qml-2
mlvljr

Vì vậy, tôi không mất nó lần nữa, đây là một thư viện thực hiện phương pháp trường khoảng cách của Valve. code.google.com/p/glyphy Tôi chưa thử. Cũng có thể đáng xem: code.google.com/p/sign-distance-field-font-generator
Timmmm

7
"ngoài chủ đề" này là lời nguyền của tràn ngăn xếp. nghiêm túc?
Nikolaos Giotis

1
phiên bản "làm thế nào" ngây thơ hơn: stackoverflow.com/questions/8847899/
triệt

Câu trả lời:


202

Kết xuất đường viền, trừ khi bạn chỉ hiển thị tổng cộng một chục ký tự, vẫn là "không đi" do số lượng đỉnh cần thiết cho mỗi ký tự cho độ cong gần đúng. Mặc dù đã có các cách tiếp cận để đánh giá các đường cong bezier trong trình đổ bóng pixel, nhưng chúng không bị khử răng cưa một cách dễ dàng, điều này không quan trọng bằng cách sử dụng một tứ giác có kết cấu bản đồ khoảng cách và đánh giá các đường cong trong trình đổ bóng vẫn đắt hơn nhiều so với mức cần thiết.

Sự đánh đổi tốt nhất giữa "nhanh" và "chất lượng" vẫn là các quads có kết cấu với kết cấu trường khoảng cách đã ký. Nó rất chậm hơn một chút so với sử dụng một quad có kết cấu bình thường, nhưng không quá nhiều. Mặt khác, chất lượng là ở một sân bóng hoàn toàn khác. Các kết quả thực sự tuyệt vời, nó nhanh như bạn có thể nhận được, và các hiệu ứng như phát sáng cũng rất dễ dàng để thêm vào. Ngoài ra, kỹ thuật có thể được hạ cấp độc đáo xuống phần cứng cũ, nếu cần.

Xem giấy Valve nổi tiếng về kỹ thuật.

Kỹ thuật này về mặt khái niệm tương tự như cách các bề mặt ẩn (siêu dữ liệu và như vậy) hoạt động, mặc dù nó không tạo ra đa giác. Nó chạy hoàn toàn trong pixel shader và lấy khoảng cách được lấy mẫu từ kết cấu làm hàm khoảng cách. Mọi thứ trên ngưỡng đã chọn (thường là 0,5) là "trong", mọi thứ khác là "hết". Trong trường hợp đơn giản nhất, trên phần cứng không có khả năng tạo bóng 10 năm tuổi, đặt ngưỡng kiểm tra alpha thành 0,5 sẽ thực hiện điều đó chính xác (mặc dù không có hiệu ứng đặc biệt và khử răng cưa).
Nếu một người muốn thêm một chút trọng lượng cho phông chữ (giả đậm), một ngưỡng nhỏ hơn một chút sẽ thực hiện thủ thuật mà không sửa đổi một dòng mã (chỉ cần thay đổi đồng phục "font_ weight" của bạn). Đối với hiệu ứng phát sáng, người ta chỉ cần coi mọi thứ trên một ngưỡng là "trong" và mọi thứ trên ngưỡng khác (nhỏ hơn) là "ngoài, nhưng trong phát sáng" và LERP giữa hai. Khử răng cưa hoạt động tương tự.

Bằng cách sử dụng giá trị khoảng cách được ký 8 bit thay vì một bit, kỹ thuật này tăng độ phân giải hiệu quả của bản đồ kết cấu của bạn lên 16 lần cho mỗi chiều (thay vì đen và trắng, tất cả các sắc thái có thể được sử dụng, do đó chúng tôi có 256 lần thông tin sử dụng cùng một bộ lưu trữ). Nhưng ngay cả khi bạn phóng to vượt xa 16 lần, kết quả vẫn có vẻ khá chấp nhận được. Các đường thẳng dài cuối cùng sẽ trở nên hơi gượng gạo, nhưng sẽ không có các tạo tác lấy mẫu "khối" điển hình.

Bạn có thể sử dụng một shader hình học để tạo ra các quads trong số các điểm (giảm băng thông bus), nhưng thành thật mà nói thì mức tăng khá ít. Điều này cũng đúng với kết xuất ký tự được mô tả như được mô tả trong GPG8. Chi phí đầu tư chỉ được khấu hao nếu bạn có nhiều văn bản để vẽ. Những lợi ích, theo tôi, không liên quan đến sự phức tạp thêm và không hạ cấp. Thêm vào đó, bạn bị giới hạn bởi số lượng thanh ghi không đổi hoặc bạn phải đọc từ một đối tượng bộ đệm kết cấu, không tối ưu cho sự kết hợp bộ đệm (và mục đích là tối ưu hóa để bắt đầu!).
Một bộ đệm đỉnh đơn giản, đơn giản cũ cũng nhanh như vậy (có thể nhanh hơn) nếu bạn lên lịch tải lên trước một chút và sẽ chạy trên mọi phần cứng được xây dựng trong 15 năm qua. Và, nó không giới hạn ở bất kỳ số lượng ký tự cụ thể nào trong phông chữ của bạn cũng như số lượng ký tự cụ thể để hiển thị.

Nếu bạn chắc chắn rằng bạn không có nhiều hơn 256 ký tự trong phông chữ của mình, các mảng kết cấu có thể đáng xem xét để loại bỏ băng thông xe buýt theo cách tương tự như tạo ra các hình tứ giác từ các điểm trong trình đổ bóng hình học. Khi sử dụng một kết cấu mảng, tọa độ kết cấu của tất cả các hình tứ giác có tọa độ giống hệt nhau, không đổi sttọa độ và chỉ khác nhau về rtọa độ, bằng với chỉ số ký tự để hiển thị.
Nhưng giống như các kỹ thuật khác, mức tăng dự kiến ​​là không đáng kể với chi phí không tương thích với phần cứng thế hệ trước.

Có một công cụ tiện dụng của Jonathan Dummer để tạo họa tiết khoảng cách: trang mô tả

Cập nhật:
Như gần đây đã chỉ ra trong Vertex Pulling có thể lập trình (D. Rákos, "OpenGL Insights", trang 239), không có độ trễ hoặc chi phí đáng kể nào liên quan đến việc kéo dữ liệu đỉnh được lập trình từ trình tạo bóng trên các thế hệ GPU mới nhất, so với làm tương tự bằng cách sử dụng chức năng cố định tiêu chuẩn.
Ngoài ra, các thế hệ GPU mới nhất có bộ nhớ L2 mục đích chung có kích thước hợp lý hơn (ví dụ 1536kiB trên nvidia Kepler), do đó, người ta có thể mong đợi vấn đề truy cập không nhất quán khi kéo các offset ngẫu nhiên cho các góc tứ giác từ kết cấu bộ đệm ít hơn vấn đề.

Điều này làm cho ý tưởng kéo dữ liệu không đổi (chẳng hạn như kích thước quad) từ kết cấu bộ đệm hấp dẫn hơn. Do đó, việc triển khai giả thuyết có thể làm giảm chuyển PCIe và bộ nhớ, cũng như bộ nhớ GPU, xuống mức tối thiểu với cách tiếp cận như sau:

  • Chỉ tải lên một chỉ mục ký tự (mỗi ký tự được hiển thị) làm đầu vào duy nhất cho trình tạo bóng đỉnh truyền vào chỉ mục này gl_VertexIDvà khuếch đại lên 4 điểm trong trình tạo bóng hình học, vẫn có chỉ mục ký tự và id đỉnh (điều này sẽ là "gl_primitiveID có sẵn trong shader đỉnh") làm thuộc tính duy nhất và nắm bắt điều này thông qua phản hồi chuyển đổi.
  • Điều này sẽ nhanh chóng, bởi vì chỉ có hai thuộc tính đầu ra (nút cổ chai chính trong GS) và nó gần với "no-op" nếu không trong cả hai giai đoạn.
  • Ràng buộc một kết cấu bộ đệm chứa, đối với mỗi ký tự trong phông chữ, các vị trí đỉnh của hình tứ giác có kết cấu so với điểm gốc (về cơ bản là "số liệu phông chữ"). Dữ liệu này có thể được nén thành 4 số trên mỗi quad bằng cách lưu trữ phần bù của đỉnh bên trái phía dưới và mã hóa chiều rộng và chiều cao của hộp căn chỉnh trục (giả sử một nửa số float, đây sẽ là 8 byte bộ đệm không đổi cho mỗi ký tự - một phông chữ 256 ký tự điển hình có thể phù hợp hoàn toàn với 2kiB của bộ đệm L1).
  • Đặt đồng phục cho đường cơ sở
  • Ràng buộc một kết cấu đệm với độ lệch ngang. Những thể có lẽ thậm chí được tính toán trên GPU, nhưng nó là dễ dàng hơn và hiệu quả hơn với loại điều trên CPU, vì nó là một hoạt động đúng tuần tự và không phải ở tất cả tầm thường (nghĩ về kerning). Ngoài ra, nó sẽ cần một thông tin phản hồi khác, đó sẽ là một điểm đồng bộ hóa khác.
  • Kết xuất dữ liệu được tạo trước đó từ bộ đệm phản hồi, trình tạo bóng đỉnh kéo phần bù ngang của điểm gốc và phần bù của các đỉnh góc từ các đối tượng bộ đệm (sử dụng id nguyên thủy và chỉ mục ký tự). ID đỉnh ban đầu của các đỉnh được gửi bây giờ là "ID nguyên thủy" của chúng tôi (hãy nhớ rằng GS đã biến các đỉnh thành hình tứ giác).

Như thế này, một cách lý tưởng có thể giảm 75% băng thông đỉnh yêu cầu (khấu hao), mặc dù nó chỉ có thể hiển thị một dòng duy nhất. Nếu một người muốn có thể kết xuất nhiều dòng trong một cuộc gọi vẽ, người ta sẽ cần thêm đường cơ sở vào kết cấu bộ đệm, thay vì sử dụng đồng phục (làm cho băng thông tăng nhỏ hơn).

Tuy nhiên, ngay cả khi giả định giảm 75% - vì dữ liệu đỉnh để hiển thị số lượng văn bản "hợp lý" chỉ ở đâu đó khoảng 50-100kiB (thực tế là bằng khôngvới GPU hoặc bus PCIe) - Tôi vẫn nghi ngờ rằng sự phức tạp được thêm vào và mất khả năng tương thích ngược thực sự đáng để xử lý. Giảm 0% vẫn chỉ là 0. Tôi đã thừa nhận không thử cách tiếp cận trên, và sẽ cần nhiều nghiên cứu hơn để đưa ra một tuyên bố thực sự đủ điều kiện. Tuy nhiên, trừ khi ai đó có thể chứng minh sự khác biệt hiệu suất thực sự đáng kinh ngạc (sử dụng số lượng văn bản "bình thường", chứ không phải hàng tỷ ký tự!), Quan điểm của tôi vẫn cho rằng đối với dữ liệu đỉnh, bộ đệm đỉnh đơn giản, đơn giản là đủ tốt được coi là một phần của "giải pháp hiện đại". Nó đơn giản và dễ hiểu, nó hoạt động, và nó hoạt động tốt.

Đã tham khảo " Thông tin chi tiết về OpenGL " ở trên, cũng đáng để chỉ ra chương "Kết xuất hình dạng 2D theo trường khoảng cách" của Stefan Gustavson, giải thích rất rõ về kết xuất trường khoảng cách.

Cập nhật 2016:

Trong khi đó, tồn tại một số kỹ thuật bổ sung nhằm loại bỏ các vật phẩm làm tròn góc trở nên đáng lo ngại ở độ phóng đại cực lớn.

Một cách tiếp cận chỉ đơn giản là sử dụng các trường khoảng cách giả thay vì các trường khoảng cách (sự khác biệt là khoảng cách là khoảng cách ngắn nhất không phải với phác thảo thực tế, mà là phác thảo hoặc một đường tưởng tượng nhô ra ngoài rìa). Điều này có phần tốt hơn và chạy ở cùng tốc độ (shader giống hệt nhau), sử dụng cùng một lượng bộ nhớ kết cấu.

Một cách tiếp cận khác sử dụng trung vị ba trong một chi tiết kết cấu ba kênh và triển khai có sẵn tại github . Điều này nhằm mục đích là một cải tiến đối với và hoặc các vụ hack được sử dụng trước đây để giải quyết vấn đề. Chất lượng tốt, hơi, hầu như không đáng chú ý, chậm hơn, nhưng sử dụng bộ nhớ kết cấu nhiều gấp ba lần. Ngoài ra, các hiệu ứng phụ (ví dụ: phát sáng) khó hơn để có được đúng.

Cuối cùng, việc lưu trữ các đường cong bezier thực tế tạo nên các ký tự và đánh giá chúng trong một shader mảnh đã trở nên thiết thực , với hiệu suất kém hơn một chút (nhưng không đến nỗi nó là một vấn đề) và kết quả tuyệt vời ngay cả ở độ phóng đại cao nhất.
Bản demo WebGL hiển thị một tệp PDF lớn với kỹ thuật này trong thời gian thực có sẵn tại đây .


1
Chúng trông khá tốt (ngay cả với bộ lọc ngây thơ và không có mipmapping, vì bạn có kết cấu rất nhỏ và dữ liệu được nội suy độc đáo). Cá nhân tôi nghĩ rằng chúng thậm chí trông còn đẹp hơn cả "thực tế" trong nhiều trường hợp, bởi vì không có sự kỳ quặc nào như gợi ý, thường tạo ra những thứ mà tôi cho là "kỳ lạ". Ví dụ: văn bản nhỏ hơn đột nhiên không được in đậm mà không có lý do rõ ràng, cũng không bật ranh giới pixel - các hiệu ứng bạn thường thấy với phông chữ "thực". Có thể có những lý do lịch sử cho điều đó (1985 b / w hiển thị), nhưng ngày nay, nó vượt quá tầm hiểu biết của tôi tại sao nó phải như thế.
Damon

2
Hoạt động và trông tuyệt vời, cảm ơn vì đã chia sẻ! Đối với những người muốn nguồn shader mảnh HLSL xem tại đây . Bạn có thể điều chỉnh điều này cho GLSL bằng cách thay thế clip(...)dòng bằng if (text.a < 0.5) {discard;}(hoặc text.a < threshold). HTH.
Kỹ sư

1
Cảm ơn các cập nhật. Tôi ước tôi có thể upvote một lần nữa.
Ben Voigt

2
@NicolBolas: Có vẻ như bạn chưa đọc kỹ. Cả hai câu hỏi được giải thích trong câu trả lời. Kepler được đưa ra như một ví dụ "gen mới nhất", không có lần thứ hai (và nó giải thích tại sao), và tôi nói rằng tôi không tin rằng kỹ thuật tiết kiệm băng thông giả định là nhanh hơn đáng kể hoặc đáng để gặp rắc rối. Tuy nhiên, niềm tin có nghĩa là không có gì - người ta sẽ phải cố gắng để biết (Tôi đã không nghĩ rằng việc vẽ số lượng văn bản "bình thường" là một nút cổ chai). Tuy nhiên, nó có thể có giá trị khi người ta tuyệt vọng về băng thông và có lượng văn bản "bất thường".
Damon

3
@NicolBolas: Bạn nói đúng về câu đó, xin lỗi. Nó thực sự là một chút sai lệch. Trong đoạn trước, tôi đã viết "Một người thậm chí có thể tạo ra điều này trên GPU, nhưng điều đó sẽ yêu cầu phản hồi và ... không hợp lý." - nhưng sau đó tiếp tục nhầm với "dữ liệu được tạo từ bộ đệm phản hồi" . Tôi sẽ sửa nó. Trên thực tế, tôi sẽ viết lại những thứ hoàn chỉnh vào cuối tuần, vì vậy nó ít mơ hồ hơn.
Damon

15

http://code.google.com.vn/p/glyphy/

Sự khác biệt chính giữa GLyphy và các trình kết xuất OpenGL dựa trên SDF khác là hầu hết các dự án khác lấy mẫu SDF thành một kết cấu. Điều này có tất cả các vấn đề thông thường mà lấy mẫu có. I E. nó làm biến dạng các phác thảo và có chất lượng thấp. Thay vào đó, GLyphy đại diện cho SDF bằng cách sử dụng các vectơ thực tế được gửi tới GPU. Điều này dẫn đến kết xuất chất lượng rất cao.

Nhược điểm là mã dành cho iOS với OpenGL ES. Có lẽ tôi sẽ tạo một cổng OpenGL 4.x của Windows / Linux (hy vọng tác giả sẽ thêm một số tài liệu thực tế).


3
Bất cứ ai quan tâm đến GLyphy có lẽ nên xem bài nói chuyện của tác giả tại Linux.conf.au 2014: youtube.com/watch?v=KdNxR5V7prk
Fizz

14

Các kỹ thuật phổ biến nhất vẫn là kết cấu quads. Tuy nhiên vào năm 2005, LORIA đã phát triển một thứ gọi là kết cấu vector, tức là vẽ đồ họa vector dưới dạng kết cấu trên các nguyên thủy. Nếu một người sử dụng điều này để chuyển đổi phông chữ TrueType hoặc OpenType thành kết cấu vector, bạn sẽ nhận được điều này:

http://alice.loria.fr/index.php/publications.html?Paper=VTM@2005


2
Bạn có biết bất kỳ triển khai sử dụng kỹ thuật này?
luke

2
Không (như ở cấp độ sản xuất), nhưng bài viết của Kilgard (xem câu trả lời của tôi dưới đây để biết liên kết) có một bài phê bình ngắn gọn, mà tôi tóm tắt là: chưa thực tế. Đã có nhiều nghiên cứu trong khu vực; công việc gần đây nhiều trích dẫn bởi Kilgard bao gồm research.microsoft.com/en-us/um/people/hoppe/ravg.pdfuwspace.uwaterloo.ca/handle/10012/4262
Fizz

9

Tôi ngạc nhiên khi em bé của Mark Kilgard, NV_path_Vndering (NVpr), không được đề cập bởi bất kỳ điều nào ở trên. Mặc dù mục tiêu của nó là tổng quát hơn so với kết xuất phông chữ, nhưng nó cũng có thể hiển thị văn bản từ phông chữ và với k sâu. Nó thậm chí không yêu cầu OpenGL 4.1, nhưng nó là một phần mở rộng chỉ dành cho nhà cung cấp / Nvidia vào lúc này. Về cơ bản, nó biến phông chữ thành các đường dẫn sử dụng glPathGlyphsNVtùy thuộc vào thư viện freetype2 để lấy số liệu, v.v. Sau đó, bạn cũng có thể truy cập thông tin tiên phong với glGetPathSpacingNVvà sử dụng cơ chế kết xuất đường dẫn chung của NVpr để hiển thị văn bản từ sử dụng phông chữ "đã chuyển đổi". (Tôi đặt nó trong dấu ngoặc kép, vì không có chuyển đổi thực sự, các đường cong được sử dụng như hiện tại.)

Các bản demo ghi cho khả năng phông chữ NVpr của là tiếc là không đặc biệt ấn tượng. (Có lẽ ai đó nên tạo một bản dọc theo bản demo SDF thú vị hơn nhiều mà người ta có thể tìm thấy trên các intertubes ...)

Bài thuyết trình API NVpr 2011 cho phần phông chữ bắt đầu tại đây và tiếp tục trong phần tiếp theo ; thật đáng tiếc khi bài thuyết trình đó bị chia tách.

Thêm tài liệu chung về NVpr:

  • Trung tâm Nvidia NVpr , nhưng một số tài liệu trên trang đích không phải là cập nhật nhất
  • Siggraph 2012 giấy cho bộ não của phương pháp kết xuất đường dẫn, được gọi là "stprint, sau đó che" (StC); bài báo cũng giải thích ngắn gọn về cách thức công nghệ cạnh tranh như Direct2D hoạt động. Các bit liên quan đến phông chữ đã được chuyển xuống một phụ lục của bài báo . Ngoài ra còn có một số tính năng bổ sung như video / bản demo .
  • Trình bày GTC 2014 cho một trạng thái cập nhật; tóm lại: hiện tại nó được hỗ trợ bởi Google Skia (Nvidia đã đóng góp mã vào cuối năm 2013 và 2014), lần lượt được sử dụng trong Google Chrome và [độc lập với Skia, tôi nghĩ] trong bản beta của Adobe Illustrator CC 2014
  • tài liệu chính thức trong sổ đăng ký mở rộng OpenGL
  • USPTO đã cấp ít nhất bốn bằng sáng chế cho Kilgard / Nvidia liên quan đến NVpr, trong đó bạn có thể nên biết, trong trường hợp bạn muốn tự mình thực hiện StC: US8698837 , US8698808 , US8704830US8730253 . Lưu ý rằng có thêm 17 tài liệu USPTO được kết nối với tài liệu này là "cũng được xuất bản", hầu hết trong số đó là các ứng dụng bằng sáng chế, do đó hoàn toàn có thể được cấp thêm bằng sáng chế từ những tài liệu đó.

Và vì từ "stprint" không tạo ra bất kỳ lượt truy cập nào trên trang này trước câu trả lời của tôi, nên nó xuất hiện tập hợp con của cộng đồng SO đã tham gia trên trang này, mặc dù có khá nhiều, không biết về stess-đệm, không có tessname phương pháp dựa trên để hiển thị đường dẫn / phông chữ nói chung. Kilgard có một bài đăng giống như FAQ trên diễn đàn opengl , điều này có thể cho thấy các phương thức kết xuất đường dẫn không có tessname khác với đồ họa 3D tiêu chuẩn không có thật, mặc dù họ vẫn đang sử dụng GPU [GP]. (NVpr cần chip có khả năng CUDA.)

Đối với viễn cảnh lịch sử, Kilgard cũng là tác giả của "API dựa trên OpenGL đơn giản cho văn bản được kết cấu", SGI, 1997 , không nên nhầm lẫn với NVpr dựa trên stprint đã ra mắt năm 2011.


Hầu hết nếu không phải tất cả các phương pháp gần đây được thảo luận trên trang này, bao gồm các phương pháp dựa trên stprint như phương pháp dựa trên NVpr hoặc SDF như GLyphy (mà tôi không thảo luận thêm ở đây vì các câu trả lời khác đã đề cập đến nó) tuy nhiên có một hạn chế: phù hợp để hiển thị văn bản lớn trên màn hình thông thường (~ 100 DPI) mà không có răng cưa ở bất kỳ mức độ nào, và chúng cũng trông đẹp, ngay cả ở kích thước nhỏ, trên màn hình cao, giống như võng mạc. Tuy nhiên, họ không cung cấp đầy đủ những gì Direct2D + DirectWrite của Microsoft cung cấp cho bạn, cụ thể là gợi ý các hình tượng nhỏ trên màn hình chính. (Đối với một cuộc khảo sát trực quan về gợi ý nói chung, hãy xem trang typotheque này chẳng hạn. Một tài nguyên chuyên sâu hơn là trên antigrain.com .)

Tôi không biết bất kỳ công cụ dựa trên OpenGL nào được sản xuất và có thể làm những gì Microsoft có thể làm với gợi ý vào lúc này. . làm gợi ý tất cả, điều này làm phiền một số người .) Dù sao, có một bài nghiên cứu năm 2013 đề cập đến gợi ý thông qua các shader OpenGL được viết bởi Nicolas P. Rougier của INRIA; có lẽ đáng đọc nếu bạn cần gợi ý từ OpenGL. Mặc dù có vẻ như một thư viện như freetype đã thực hiện tất cả công việc khi nói đến gợi ý, nhưng thực tế không phải vậy vì lý do sau, mà tôi trích dẫn từ bài báo:

Thư viện FreeType có thể rasterize glyph bằng cách sử dụng khử răng cưa pixel phụ ở chế độ RGB. Tuy nhiên, đây chỉ là một nửa của vấn đề, vì chúng tôi cũng muốn đạt được định vị pixel phụ để đặt glyphs chính xác. Hiển thị hình tứ giác có kết cấu ở tọa độ pixel phân đoạn không giải quyết được vấn đề, vì nó chỉ dẫn đến nội suy kết cấu ở mức toàn pixel. Thay vào đó, chúng tôi muốn đạt được một sự thay đổi chính xác (giữa 0 và 1) trong miền subpixel. Điều này có thể được thực hiện trong một shader mảnh [...].

Giải pháp không chính xác tầm thường, vì vậy tôi sẽ không cố gắng giải thích nó ở đây. (Bài viết là truy cập mở.)


Một điều khác mà tôi đã học được từ bài báo của Rougier (và dường như Kilgard không xem xét) là các quyền hạn về phông chữ (Microsoft + Adobe) đã tạo ra không chỉ một mà hai phương thức đặc tả kỹ thuật. Cái cũ dựa trên cái gọi là bảng kern và nó được hỗ trợ bởi freetype. Cái mới được gọi là GPOS và nó chỉ được hỗ trợ bởi các thư viện phông chữ mới hơn như HarfBuzz hoặc pango trong thế giới phần mềm miễn phí. Vì NVpr dường như không hỗ trợ một trong hai thư viện đó, nên kTHER có thể không hoạt động với NVpr cho một số phông chữ mới; có một số trong số đó rõ ràng trong tự nhiên, theo thảo luận diễn đàn này .

Cuối cùng, nếu bạn cần thực hiện bố cục văn bản phức tạp (CTL), bạn dường như không gặp may mắn với OpenGL vì không có thư viện dựa trên OpenGL nào tồn tại cho điều đó. (Mặt khác, DirectWrite có thể xử lý CTL.) Có các thư viện có nguồn mở như HarfBuzz có thể kết xuất CTL, nhưng tôi không biết làm thế nào để chúng hoạt động tốt (như sử dụng các phương pháp dựa trên stprint) thông qua OpenGL. Bạn có thể phải viết mã keo để trích xuất các phác thảo có hình dạng lại và đưa chúng vào các giải pháp dựa trên NVpr hoặc SDF dưới dạng đường dẫn.


4
Tôi đã không đề cập đến NV_path_Vndering vì đây là tiện ích mở rộng, thuộc sở hữu của nhà cung cấp để làm cho vấn đề tồi tệ hơn. Tôi thường cố gắng chỉ đưa ra câu trả lời cho các kỹ thuật được áp dụng phổ biến.
datenwolf

1
Vâng, tôi có thể đồng ý với điều đó ở một mức độ nào đó. Bản thân phương thức ("stpson, sau đó che") thực sự không khó thực hiện trực tiếp trong OpenGL, nhưng nó sẽ có chi phí lệnh cao nếu được thực hiện một cách ngây thơ như vậy, vì các nỗ lực dựa trên stprint trước đó đã kết thúc. Skia [thông qua Ganesh] đã thử một giải pháp dựa trên stprint tại điểm, nhưng đã từ bỏ nó, theo Kilgrad. Cách mà Nvidia thực hiện, một lớp bên dưới, sử dụng các khả năng CUDA, sẽ khiến nó thực hiện. Bạn có thể cố gắng "Tự mình" StC bằng cách sử dụng toàn bộ các tiện ích mở rộng EXT / ARB. Nhưng hãy cẩn thận khi Kilgard / Nvidia có hai ứng dụng bằng sáng chế trên NVpr.
Fizz

3

Tôi nghĩ rằng cách tốt nhất của bạn là nhìn vào đồ họa cairo với phụ trợ OpenGL.

Vấn đề duy nhất tôi gặp phải khi phát triển một nguyên mẫu với 3,3 lõi là việc sử dụng chức năng không được chấp nhận trong phụ trợ OpenGL. Đó là 1-2 năm trước nên tình hình có thể được cải thiện ...

Dù sao, tôi hy vọng trong tương lai trình điều khiển đồ họa opengl sẽ triển khai OpenVG.

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.