Trò chơi 2D và OpenGL hiện đại


10

Định kiến

Ok, vì vậy những gì tôi đã thu thập được cho đến nay là:

  • không sử dụng đường ống cố định (không dùng nữa hoặc sẽ không được dùng nữa)
  • vbos lưu trữ "mô hình đối tượng" (n dữ liệu đỉnh, chủ yếu)
  • vaos mô tả cách dữ liệu được đặt xuống để các cuộc gọi rút ra biết phần nào của mỗi vbo dành cho loại thông tin đỉnh nào (một vao có thể tham chiếu đến nhiều vbos, ngược lại là khó khăn)
  • mỗi lệnh gọi cũng gửi dữ liệu đỉnh tới các shader

Cách tôi xem 3D (tùy chọn)

Với những thông tin này, tôi có thể thấy cách vẽ các đối tượng phức tạp 3D rất đẹp với OpenGL hiện đại. Về cơ bản, bạn tải một loạt các mô hình đối tượng (có thể từ Blender hoặc phần mềm tương tự khác) vào VBO với tọa độ cục bộ, sau đó bạn chỉ cần cung cấp cho mỗi phiên bản của một đối tượng một tham số shader khác nhau (offset) để vẽ vào không gian thế giới.

Vấn đề / câu hỏi

Trong các vấn đề 2D và ưu tiên là hoàn toàn khác nhau, mặc dù. Bạn không vẽ nhiều đối tượng phức tạp, bạn không cần các ma trận chiếu phức tạp và các chú thích và shader đơn giản hơn nhiều.

Điều gì sẽ là cách tốt nhất để vẽ thường xuyên (thực sự thường xuyên, về cơ bản mọi khung hình) thay đổi hình học với OpenGL hiện đại?

Trong đoạn văn sau, bạn có thể thấy một số ý tưởng về các vấn đề (vấn đề hình tròn và hình chữ nhật), xác định rõ hơn loại thay đổi mà tôi quan tâm.

Nỗ lực của tôi (tùy chọn)

Vì vậy, tôi bắt đầu nghĩ làm thế nào tôi sẽ đối phó với việc vẽ hình học 2D cơ bản trên màn hình:

  • hình vuông: tải [(1, 0), (1, 1), (0, 1), (0, 0)]VBO cho hình dạng của hình vuông trong không gian cục bộ, sau đó cung cấp cho shader chiều rộng thực tế của tọa độ hình vuông và thế giới và thông tin màu sắc

làm mát, trông dễ dàng. Hãy di chuyển đến một vòng tròn:

  • một vòng tròn: quạt tam giác với ... eh. độ chính xác bao nhiêu (số đỉnh)? đối với vòng tròn nhỏ, độ chính xác phải nhỏ và đối với vòng tròn lỗi thì độ chính xác phải cao. Rõ ràng tải 1 VBO có thể có thể phù hợp với tất cả các trường hợp. Điều gì xảy ra nếu tôi cần thêm độ chính xác vì một vòng tròn được thay đổi kích thước để lớn hơn?

Ít mát mẻ. Hãy di chuyển đến một cái gì đó dễ dàng hơn một chút, một hình chữ nhật:

  • một hình chữ nhật: eh. không có "hình học hình chữ nhật chung". Bạn chỉ có tỷ lệ chiều rộng / chiều cao và đó là như vậy, nhưng mỗi hình chữ nhật có thể khác nhau nếu kích thước thay đổi.

Như bạn có thể thấy, mọi thứ đi xuống dốc từ đó. Đặc biệt với đa giác phức tạp và whatnot.

Không có chính sách mã: P

Tôi chỉ cần một cái nhìn tổng quan về ý tưởng, không có mã nào là cần thiết, đặc biệt là mã C hoặc C ++. Chỉ cần nói những thứ như: "tạo VBO với dữ liệu đỉnh này và sau đó liên kết nó, ...".


Tôi nghĩ rằng tôi hiểu những gì bạn đang hỏi, nhưng bạn có thể muốn đưa ra câu hỏi này một chút hướng. Có một chút không rõ ràng những gì đang được hỏi - đó thực sự là một lý do gần gũi.
Lysol

@AidanMueller Tôi không chắc ý của bạn là gì, nhưng hãy thoải mái đưa ra nhiều hướng hơn nếu bạn cảm thấy cần thiết.
Giày

Câu trả lời hàng đầu hiện đang bắt đầu bằng cách nói "Bạn có vẻ là câu hỏi chính". Điều đó chỉ ra rằng không rõ bạn đang hỏi gì. Có lẽ bạn nên đưa ra một bản tóm tắt về những gì bạn cần không biết ở cuối câu hỏi của bạn. Đây là một Q / A sau khi tất cả, không phải là một cuộc thảo luận.
Lysol

@AidanMueller Không phải trong bối cảnh đó, tôi tin. Nó nói "Câu hỏi chính của bạn dường như là ..." và sau đó anh ấy / cô ấy trích dẫn câu hỏi tôi đã đăng. Mà thực sự chỉ ra rằng nó là đủ rõ ràng để được trích dẫn. Ngoài ra, cụm từ chỉ ra rằng không phải câu hỏi của tôi không rõ ràng, mà là có một câu hỏi chính và một câu hỏi phụ khác (đó là: giải pháp cho các trường hợp cụ thể tôi đã trình bày). Tôi thực sự không thấy vấn đề với câu hỏi hiện tại của mình và dường như ngay cả những người trả lời cũng không làm như vậy vì tôi thấy cả hai câu trả lời đều rất hữu ích.
Giày

Bạn có thể vẽ một vòng tròn chính xác với một shader mảnh.
dùng253751

Câu trả lời:


5

Câu hỏi chính của bạn dường như là:

Điều gì sẽ là cách tốt nhất để vẽ thường xuyên (thực sự thường xuyên, về cơ bản mọi khung hình) thay đổi hình học với OpenGL hiện đại?

Trong hầu hết các cách, không có sự khác biệt lớn giữa 2d và 3d OpenGL. Đường ống đồ họa có thêm một tọa độ Z, sẽ không được sử dụng nhiều trong 2ngày, nhưng đó là về nó.

Có một vài cách để thay đổi hình học trên mỗi lần vẽ.

  • Bạn có thể đẩy các đỉnh mới do CPU cung cấp mỗi khung. (Xem /programming/14155615/opengl-updating-vertex-buffer-with-glbufferdata để biết một số lưu ý về việc sử dụng lại bộ đệm.)

  • Bạn có thể vẽ các phần khác nhau của bộ đệm hiện có glDrawArrays(mode, first, count). Nếu các vòng lặp hoạt hình, có thể bạn có thể đặt các khung được tính toán trước với các danh sách đỉnh khác nhau trong một bộ đệm lớn và vẽ phần thích hợp của bộ đệm cho mỗi khung.

  • Bạn có thể ảnh hưởng đến danh sách đỉnh với một số dữ liệu khác, như một mảng đồng nhất hoặc kết cấu. Trong shader đỉnh của bạn, đọc dữ liệu này và áp dụng nó một cách thích hợp. Đây chỉ là những thành ngữ khác để trình bày dữ liệu cho GPU và có lẽ sẽ không có nhiều khác biệt về hiệu suất.

  • Nếu bạn có nhiều phiên bản của cùng một hình học (có thể bị ảnh hưởng bởi các thuộc tính), thì glDrawElementsInstanced()có thể hữu ích

  • Bạn có thể ảnh hưởng đến danh sách đỉnh theo thuật toán trong các shader đỉnh, hình học hoặc tessname. Nếu hình ảnh động có thể được mô tả bằng toán học, bạn có thể giữ cùng một danh sách đỉnh và thay đổi chỉ một vài đồng phục đổ bóng cho mỗi khung.

Và có lẽ hoạt hình của bạn có thể được thể hiện dưới dạng kết cấu thuần túy, với tất cả hoạt ảnh được thực hiện theo pixel bởi cpu hoặc được kết xuất trước từ đĩa.

Nói chung, tôi nói, "Máy tính rất nhanh, làm cho nó hoạt động theo cách dễ nhất có thể, có lẽ bằng cách đặt các đỉnh tạo ra CPU mới cho mỗi khung hình. Sau đó, hãy xem liệu nó có đủ tốt không. Sử dụng pin / CPU đầu tiên, dấu chân bộ nhớ thứ hai. "

Câu hỏi khác của bạn , được diễn giải, "Cách tốt nhất để vẽ hình tròn và hình chữ nhật là gì?"

Vòng tròn.

  • Với các shader tessname (hoặc shader hình học), bạn có thể làm cho hình học của bạn năng động.

  • Bạn có thể vẽ các hình vuông và trong shader mảnh của bạn chỉ mờ đục (alpha = 1.0) trong bán kính và trong suốt (alpha = 0,0) bên ngoài bán kính. Sau đó, pixel của nó hoàn hảo mọi lúc. (Tạo các đỉnh hình vuông của bạn -1 đến +1 và trong shader mảnh giống như , outColor.a = dot(coord.xy, coord.xy) < 1.0 ? 1.0 : 0.0;. Cũng có thể làm mịn cạnh một chút, trông sẽ rất đẹp ở đó ...)

  • Bạn có thể luôn luôn sử dụng một chiếc quạt 120 tam giác. Có lẽ là đủ tốt.

Hình chữ nhật.

  • Tôi nghĩ rằng bạn đã trả lời câu hỏi của riêng bạn, trên đó. Những gì bạn đề nghị sẽ làm việc tốt!

Các mảnh-shader / radius là khá gọn gàng, cảm ơn. Liên quan đến việc tôi trả lời câu hỏi của riêng tôi, tôi không nghĩ tôi hiểu ý của bạn.
Giày

Ồ, giống như với một hình vuông, bạn đề cập đến việc kiểm soát chiều rộng (với đồng phục, tôi giả sử) và bạn đã viết, "Bạn chỉ có tỷ lệ chiều rộng / chiều cao và đó là, nhưng mỗi hình chữ nhật có thể khác nhau nếu kích thước thay đổi" . Vì vậy, đối với hình chữ nhật, hãy làm tương tự như hình vuông nhưng bạn sẽ cần 4 giá trị (x, y, w, h) thay vì 3 (x, y, w). Hoặc truyền vào (xlow, xhigh, ylow, yhigh) dưới dạng bốn đồng phục. Với đầu vào (0,0) đến (1,1) của bạn, điều đó đủ để Vertex Shader thực hiện những gì nó cần.
david van brink

Ồ, tôi hiểu rồi, điều đó có ý nghĩa.
Giày

Có một quạt tự động trong GL hiện đại như GL_TRIANGLE_FAN từ đường ống chức năng cố định không?
John P

5

Tôi không thể nói là chuyên gia về chủ đề này và trong (các) dự án trò chơi của tôi, tôi đã tập trung nhiều hơn vào mặt 3D, vì vậy mặt 2D của tôi khá đơn giản thường sử dụng những thứ được tạo ra cho mặt 3D; và rõ ràng, quan điểm của tôi là ở khía cạnh chơi game, vì vậy đồ họa 2D của tôi thiên về các họa tiết hơn là hình học. Từ quan điểm đó,

1) Hình vuông và hình chữ nhật khá dễ dàng. Tôi chỉ có một hộp 1x1 trong một VBO mà tôi sử dụng để làm mờ mọi thứ. Tôi chuyển ma trận MVP cho shader bằng "hộp đơn vị" này và tôi đã kết hợp nó với tỷ lệ bổ sung để chia tỷ lệ hộp theo đúng kích thước - như bạn biết, bạn có thể có tỷ lệ x và y khác nhau.

Với mục đích của mình, tôi đã suy nghĩ chuyển từ sử dụng "hộp đơn vị" sang một loại động cơ hạt nào đó để làm mờ các họa tiết 2D, nhưng đó là một câu chuyện khác.

2) Tôi không làm việc nhiều với các vòng tròn, tôi chỉ sử dụng các VBO cố định với số lượng đỉnh cụ thể. Nhưng tôi có thể tưởng tượng rằng tôi có thể thực hiện một số điều chỉnh sải chân để ảnh hưởng đến số lượng đỉnh được vẽ cho vòng tròn.

Khi kết nối dữ liệu VBO với các thuộc tính shader, tôi sử dụng glVertexAttribPulum. Nó có tham số sải chân có nghĩa là được sử dụng cho dữ liệu xen kẽ (mà tôi sử dụng). Nhưng có thể sử dụng nó như thế này:

glVertexAttribPointer(..., n * sizeof(VERTEX_DATA), ...);

... để chọn mọi đỉnh thứ n từ bộ đệm, do đó ảnh hưởng đến số lượng đỉnh được vẽ cho vòng tròn. Tôi có thể tạo một số VAO có cùng VBO với các bước khác nhau ảnh hưởng đến số đỉnh được vẽ cho vòng tròn. Tôi đã không thử điều đó, nghĩ.

Nói chung, vâng, làm việc với VBO và như vậy làm cho việc điều chỉnh phía CPU trở nên phức tạp hơn một chút, tại sao tôi lại nghiên cứu những thứ khác nhau để thực hiện tinh chỉnh ở phía GPU (shader). Tuy nhiên, theo bài viết này, sử dụng VBO hiệu quả hơn trên phần cứng hiện đại ngay cả khi bạn cần nhiều "can thiệp" của CPU:

http://www.quelsolaar.com/opengl_performance.txt

Hy vọng điều này sẽ giúp bạn một chút để thiết kế và quyết định hướng đi của bạn.


2
"Điều chỉnh sải chân để ảnh hưởng đến số lượng đỉnh được vẽ cho vòng tròn" Siêu tuyệt!
david van brink
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.