Có bao nhiêu kết cấu thường tôi có thể liên kết cùng một lúc?


23

Tôi đang phát triển một công cụ trò chơi và nó sẽ chỉ hoạt động trên phần cứng hiện đại (Shader model 4+). Tôi nghĩ rằng, vào lúc tôi hoàn thành nó, đó sẽ không phải là một yêu cầu vô lý.

Câu hỏi của tôi là: có bao nhiêu kết cấu tôi có thể liên kết cùng một lúc trên một card đồ họa hiện đại? 16 sẽ là đủ. Tôi có thể mong đợi hầu hết các card đồ họa hiện đại hỗ trợ số lượng kết cấu đó không?

GTX 460 của tôi dường như hỗ trợ 32, nhưng tôi không biết đó có phải là đại diện cho hầu hết các thẻ video hiện đại hay không.


Bạn đang sử dụng API kết xuất nào?
Adam

2
Tất nhiên là OpenGL :)
Avi

Câu trả lời:


53

Số lượng kết cấu có thể được liên kết với OpenGL không phải32 hoặc 16 . Nó không phải là những gì bạn nhận được với glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Hàm đó lấy ra số lượng kết cấu có thể được truy cập bởi trình đổ bóng mảnh .

Xem, mỗi shader có giới hạn riêng về số lượng kết cấu mà nó có thể sử dụng . Tuy nhiên, cũng có tổng số kết cấu có thể được sử dụng, thời gian. Điều này được xác định (trong OpenGL) bởi GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Vì vậy, có hai giới hạn: kết cấu trên mỗi giai đoạn và kết cấu tổng giới hạn.

OpenGL 3.x xác định số lượng tối thiểu cho giới hạn mỗi giai đoạn là 16, do đó phần cứng không thể có ít hơn 16 kết cấu trên mỗi giai đoạn. Nó có thể có giới hạn cao hơn, nhưng bạn biết rằng bạn nhận được ít nhất 16. 3.x xác định số lượng tối thiểu cho kết cấu - tổng giới hạn là 48. AKA: 16 * 3 giai đoạn. Tương tự, GL 4.x định nghĩa các số là 16 kết cấu trên mỗi giai đoạn và 96 kết cấu tổng giới hạn (nghĩa là: 16 * 6 giai đoạn, bao gồm các trình đổ bóng tính toán).

Một lần nữa, đây là những con số tối thiểu . Phần cứng có thể (và không) khác nhau.

Đối với phần cứng cụ thể, bạn có thể mong đợi bất kỳ phần cứng nào thuộc lớp DX10 phù hợp với những con số này. Phần cứng lớp DX11 có một số phương sai; NVIDIA (GeForce 4xx +) và chip AMD cao cấp hơn (còn gọi là lõi GCN) có thể có nhiều hơn 16 nhân trên mỗi giai đoạn.


2
Tôi muốn đây là câu trả lời được chấp nhận. Nó sẽ giúp tôi tiết kiệm 5 phút đọc vô nghĩa.
Sợi

3

Tôi tin rằng 32 là số lượng kết cấu tối đa có thể bị ràng buộc hiện nay. Theo như tôi có thể nói ngay cả loạt 8800 có 32 đơn vị kết cấu.

Theo như tôi biết, để hỗ trợ openGL 4.x, bạn sẽ cần thẻ Fvi hoặc thẻ nvidia mới hơn (hoặc thẻ amd tương ứng), tất cả các mẫu cao cấp hơn dường như có 32 đơn vị, trong khi thẻ cấp thấp nhất (GT 430 chẳng hạn ) có 16. Tuy nhiên, nhìn vào các thông số kỹ thuật của AMD, họ liệt kê các số như 80 hoặc 128 đơn vị kết cấu, nhưng liệt kê các đơn vị ROP 32 màu dường như không đổi qua các thế hệ.

Mặt khác, GTX 480 được liệt kê với 60 đơn vị kết cấu và 48 đơn vị ROP, trong khi các thẻ cấp thấp hơn như 430 chỉ có 16 đơn vị kết cấu và 4 đơn vị ROP. Vì vậy, về tổng thể tôi không thực sự bị thuyết phục một trong số đó là con số bạn đang thực sự tìm kiếm.

Tuy nhiên, bạn có thể kiểm tra số lượng đơn vị kết cấu có sẵn để kết xuất đường ống chức năng không cố định với glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, vì vậy nếu bạn có quyền truy cập vào một số phần cứng đa dạng, bạn có thể tự kiểm tra.

EDIT: trang web này cho phép bạn so sánh các khả năng openGL được báo cáo của tất cả các loại thẻ video, sẽ cung cấp cho bạn các số bạn cần: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD và nvidia gần đây đã giới thiệu "kết cấu không ràng buộc", (amd có một tên khác cho nó) cho phép bạn sử dụng số lượng lớn kết cấu mà không ràng buộc chúng với các đơn vị textutre, tại thời điểm này chỉ có sẵn trong openGL.


1
Tiếp theo đó, câu trả lời thực sự là một cái gì đó như 'bạn có nhiều như hw có thể cung cấp'. Hoặc, từ ngữ khác, mọi thứ sẽ chạy nhanh nhất có thể. (và trong OpenGL bao gồm hầu hết mọi lĩnh vực).
Darkwings

@Darkwings Tôi cho rằng như vậy, ràng buộc nhiều kết cấu hơn phần cứng có thể xử lý thường sẽ dẫn đến lỗi hoặc trình điều khiển hết thời gian mặc dù. Tôi cũng đọc sai, anh nói shader model 4+ chứ không phải opengl 4+. Nhìn vào các thẻ DX10 đầu tiên (X2900 và 8800 họ thẻ), tất cả chúng dường như có ít nhất 16 đơn vị kết cấu.

Tôi chỉ nhấn mạnh sự thật rằng vì nó có thể được tham số hóa, nên nó phải như vậy. Ngay cả khi trò chơi phải bò trên các thẻ cũ hơn, thì đó không phải là một thứ gì đó được mã hóa cứng mà là một 'yêu cầu được đề xuất'.
Darkwings

4
-1: Câu trả lời này sai. Xem câu trả lời của tôi để biết lý do tại sao (quá dài để giải thích ở đây).
Nicol Bolas

1
Những gì có thể không rõ ràng ngay lập tức. Hầu như không ai sử dụng GL_TEXTURE n GLenums; thay vì sử dụng GL_TEXTURE0 + n, trong đó n là vị trí cần liên kết. GLenums chỉ có tối đa 32 vị trí nhưng điều đó không có nghĩa là OpenGL giới hạn bạn đến 32. Thông số kỹ thuật đảm bảo chúng sẽ tuần tự. Ngoài ra, nếu bạn không sử dụng DSA, bạn có thể muốn dành một vị trí cho liên kết để tạo / sửa đổi, để trạng thái được sử dụng để tạo / sửa đổi có ít tương tác hơn với trạng thái được sử dụng để vẽ.
Maximus Minimus
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.