Cách tốt nhất để vẽ nhiều cây


8

Tôi đang viết một ứng dụng làm cho một hòn đảo ngẫu nhiên được trồng cây. Các cây hiện đang là hai hình tứ giác, chéo chéo và được vẽ bằng kết cấu. Tôi dự định có những mắt lưới phức tạp hơn tạo thành các loại cây khác nhau, ví dụ như cây cọ, cây sồi, cỏ, v.v.

Đảo mẫu

Vấn đề tôi gặp phải là vì kết cấu trong suốt nên tôi phải vẽ chúng từ sau ra trước. Plan-b là để gọi sử dụng loại bỏ trong shader Frag, nhưng thứ tự z cho kết quả tốt hơn:

uniform float uTreeAlpha;
uniform sampler2D uTexture;

varying vec2 vTexCoordOut;

void main (void)
{
  vec4 colour = texture2D(uTexture, vTexCoordOut);
  if (colour.a < 0.1) {
    discard;
  }
  gl_FragColor = vec4(colour.rgb, colour.a * uTreeAlpha);   
}

Vấn đề thứ hai là vì thứ tự thay đổi tùy thuộc vào camera & lookat Tôi không biết một cách hiệu quả để vẽ chúng trong OpenGL trong một cuộc gọi.

Hiện tại mã kết xuất của tôi trông giống mã giả này:

if cameraChangedFromLastTime() then
  sortTreesBackToFront();
end
for i = 0 to trees.size() -1
  drawTree()
end

Trong đó mọi drawTree () đặt một số đồng phục, đặt kết cấu và sau đó gọi glDrawArrays (). Tôi có một số tối ưu hóa để bỏ qua việc thiết lập kết cấu hoặc cập nhật các kết cấu kết cấu nếu cây cuối cùng và hiện tại giống nhau, và đặt một số đồng phục phổ biến bên ngoài vòng lặp và bỏ qua các cây ở quá xa nhưng về cơ bản nếu tôi có 3000 cây tôi đi 3000 vòng quanh vòng lặp.

Vẽ từng cây riêng lẻ là kẻ giết người hiệu suất. Nếu tôi có thể rút ra chúng trong một cuộc gọi hoặc các đợt (trong khi duy trì thứ tự Z) thì có lẽ tôi sẽ như vậy trong 1/10 thời gian.

Vì vậy, làm thế nào tôi sẽ làm điều đó. Hãy nhớ rằng cây của tôi là giữ chỗ và cuối cùng tôi sẽ có:

  • Lưới khác nhau cho các cây khác nhau
  • Quy mô và góc khác nhau cho cây để đa dạng hơn
  • Các kết cấu khác nhau cho các cây khác nhau, có khả năng nhiều kết cấu được áp dụng cho một lưới (ví dụ: để lại một kết cấu, thân cây khác)
  • Cây cối được trộn lẫn với nhau, vì vậy không có cách nào đơn giản để vẽ một loại và sau đó là một loại khác
  • Một số hình thức hoạt hình chu kỳ đơn giản (cành cây bồng bềnh trong gió)
  • Tất cả các kết cấu sẽ nằm trong một tập bản đồ duy nhất

Vì vậy, cách tiếp cận tốt nhất ở đây là gì? Có khả thi để kết xuất trong một lần duy nhất không? Nếu tôi đã sử dụng glDrawElements, xây dựng lại các chỉ số nhưng không phải các đỉnh, tôi có thể đạt được điều này không?


vterrain.org , xem cột bên phải trong phần thực vật để hiển thị nhà máy, cột bên trái tương ứng, kết xuất phần để biết mức độ chi tiết / tăng tốc kết xuất chung. Hãy coi chừng: nguồn là danh sách các tài liệu nghiên cứu nhiều hơn là hướng dẫn.
Exilyth

Tôi không biết nhiều về những thứ này. Nhưng hãy kiểm tra phần mềm VUE. Nó được sử dụng để tạo cảnh quan với cây cối, núi non, bầu không khí và nhiều hơn nữa, trong 3d. Nhưng tôi không chắc liệu nó có giúp ích gì trong tình huống của bạn không
user1981248 27/03/13

Câu trả lời:


3

Những gì bạn muốn là instaging phần cứng . Lưu ý: Tôi đã thực hiện điều này trong XNA (tức là DirectX), nhưng tôi không biết nhiều về OpenGL. Tôi tích cực có một tính năng tương đương, mặc dù. Về cơ bản, số tiền mà nó liên kết với các đỉnh của mô hình cây của bạn với một luồng đỉnh khác mang tọa độ thế giới cho từng trường hợp.


1
Tương đương OpenGL sẽ là tiện ích mở rộng opengl.org/registry/specs/EXT/draw_instified.txt . Nhưng, để bắt đầu, hiển thị Danh sách trong các đối tượng OpenGL và Vertex Array đối tượng / Đối tượng bộ đệm Vertex trong OpenGL hiện đại có thể làm được. Trong cả hai trường hợp, một đối tượng / lưới được lưu trữ trong Danh sách / VAO / VBO, sau đó mỗi trường hợp được vẽ với một biến đổi khác nhau. Sử dụng các lưới tĩnh, dữ liệu có thể được tải lên một lần và sau đó được sử dụng lại. sol.gfxile.net/instANCE.html cung cấp một cái nhìn tổng quan ngắn về các phương pháp khác nhau.
Exilyth

Cảm ơn, instaging là một ý tưởng thú vị. Tuy nhiên, tôi không thể sử dụng tiện ích mở rộng draw_instified vì tôi đang sử dụng OpenGL ES 2.0 và tôi đang làm việc trên đôi khi hoạt động trên mọi thứ. Tôi nghĩ có lẽ tôi có thể tải các lưới cây khác nhau vào một VBO (có thể với các mô hình đơn giản hơn ở xa), z-sort, và sau đó vẽ chúng theo từng đợt từ bộ đệm chỉ mục mà tôi sẽ tạo cho mỗi lô. Tôi có thể vẽ 30 ​​hoặc 40 tại một thời điểm theo cách đó.
locka

2

Độ trong suốt chỉ cần được đặt hàng nếu nó sử dụng pha trộn không phụ gia. Đối với một tấn biển quảng cáo xa, việc trộn là không cần thiết (bạn thực sự không thể nhìn thấy nó). Kết xuất ít nhất những cái tiếp theo có độ trong suốt (alpha chỉ 1 hoặc 0) và bạn không cần phải sắp xếp chúng.

Bạn có thể sử dụng một bảng sắp xếp sprite để hiển thị các loại cây khác nhau, với hình động được nướng. Vẽ lưới cho những cây gần hơn mà bạn có thể làm động với độ trung thực cao hơn dựa trên gió hoặc bất cứ điều gì bạn muốn.


Tôi đã thử nghiệm sử dụng loại bỏ và không sắp xếp, nhưng kết quả trông hơi khó hiểu - cây có xu hướng chồng chéo lên nhau nên nếu không có thứ tự nhất quán, tôi nhận được rất nhiều tiếng pop nơi một cây đi trước cây kia và " thắng "pixel. Tôi đã bỏ đi vì vẫn có những va chạm không thường xuyên (ví dụ: 2 cây có cùng khoảng cách với máy ảnh) nhưng đó là một dự phòng. Tôi cũng đã thử nghiệm với các bảng quảng cáo và hiệu ứng này là quá giả, đặc biệt là đối với cầu vượt.
locka

Sử dụng biển quảng cáo tốt hơn. Lý tưởng nhất, có một mô hình cây. Tạo sprite biển quảng cáo cho góc nhìn và sử dụng sprite đó trong đó góc xấp xỉ khớp. Đối với các phần cắt ra, chúng hoạt động tốt nhất ở khoảng cách xa, nơi bạn không thể thấy sự khác biệt. Khi bạn đóng lại, bạn cần sử dụng nhiều mô hình cocmplicated hơn (có thể là một vài quads trên mỗi cây), hoặc bạn có thể chuyển sang độ trong suốt của màn hình.
Sean Middleditch

Tại một số điểm, bạn cần tìm ra sự cân bằng chấp nhận được giữa chất lượng và tốc độ. Bạn sẽ không nhận được "nhanh chóng" và "hoàn hảo" cho hầu hết các cảnh phức tạp trên phần cứng hàng hóa.
Sean Middleditch
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.