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.
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?