2011-12-20 38 views
6

Thay vì sử dụng glGenTextures() để lấy ID kết cấu không sử dụng. Tôi có thể chọn ngẫu nhiên một số, ví dụ, 99999 và sử dụng nó không?Bạn có sử dụng ID kết cấu ngẫu nhiên không?

Tôi sẽ, tất nhiên, truy vấn:

glIsTexture(m_texture) 

và chắc chắn rằng nó sai trước khi tiếp tục.

Dưới đây là một số nền:

Tôi đang phát triển một ứng dụng trình chiếu hình ảnh cho máy mac. Xem trước trình chiếu là hoàn hảo. Để lưu trình chiếu, tôi sẽ kết xuất với FBO. Tôi tạo ra một bối cảnh AGL, tạo ra một kết cấu với glGenTextures() và kết xuất với một bộ đệm khung. Tất cả cũng ngoại trừ một vấn đề nhỏ.

Sau khi tôi đã lưu trình chiếu và quay lại cửa sổ chính, tất cả hình thu nhỏ của hình ảnh của tôi có màu xám, tức là các hoạ tiết đã bị xóa.

Tôi đã điều tra và phát hiện ra rằng hình thu nhỏ của hình ảnh và kết cấu FBO của tôi bằng cách nào đó có cùng ID kết cấu. Khi tôi xóa kết cấu FBO của tôi ở cuối hoạt động lưu trình chiếu, các họa tiết hình thu nhỏ cũng bị mất. Điều này là lạ bởi vì tôi có một bối cảnh AGL trong quá trình lưu, và giao diện người dùng chính có một bối cảnh AGL khác, có lẽ được tạo ra trong nền của Core Image và tôi không có quyền kiểm soát.

Vì vậy, lựa chọn của tôi, như tôi nhìn thấy nó bây giờ, là để:

  1. Không xóa các kết cấu FBO.
  2. Chọn ngẫu nhiên ID có kết cấu cao với hy vọng giao diện người dùng chính sẽ không sử dụng nó.

Thực ra tôi đã đọc rằng bạn không nhất thiết phải xóa kết cấu của mình nếu bạn đang xóa ngữ cảnh mở AGL. Vì việc xóa ngữ cảnh OpenGL của bạn sẽ tự động xóa tất cả các hoạ tiết liên quan. Điều này có đúng không? Nếu có, tùy chọn 1 có ý nghĩa hơn.

Tôi nhận ra rằng có những điều thú vị xảy ra ở đây mà tôi thực sự không thể giải thích. Ví dụ: sau khi tôi đã lưu trình chiếu hình ảnh của mình vào tệp .mov, tôi xóa ngữ cảnh đã được tạo trong cùng một lớp. Bên phải, nó sẽ không ảnh hưởng đến kết cấu được tạo trong ngữ cảnh khác. Nhưng nó có, và tôi nghiêm túc không thể giải thích điều đó.

Trả lời

11

Cho phép tôi trả lời câu hỏi cơ bản trước: có, là hợp pháp trong OpenGL 2.1 để chỉ cần chọn tên họa tiết tùy ý và sử dụng làm kết cấu. Lưu ý rằng đó là không phải là hợp pháp trong 3,2 lõi. Thực tế là OpenGL ARB đã loại bỏ khả năng này sẽ giúp minh họa cho dù đó là một ý hay hay không.

Bây giờ, dường như bạn đã gặp phải một lỗi lạ. glGenTextures không bao giờ được trả lại tên kết cấu đã được sử dụng. Sau khi tất cả đó là những gì nó được cho. Bạn dường như bằng cách nào đó nhận được kết cấu đã được sử dụng. Tôi không biết điều đó xảy ra như thế nào.

Ngữ cảnh OpenGL, khi bị hủy, sẽ xóa tất cả tài nguyên cụ thể cho ngữ cảnh đó. Nếu bạn đã tạo ngữ cảnh thứ hai chia sẻ tài nguyên với ngữ cảnh thứ nhất, xóa ngữ cảnh thứ hai sẽ không xóa tài nguyên được chia sẻ (kết cấu, bộ đệm, v.v.). Nó sẽ xóa các tài nguyên không được chia sẻ (VAOs, vv), nhưng mọi thứ khác sẽ vẫn còn.

Tôi khuyên bạn không nên tạo và xóa kết cấu FBO liên tục. Chỉ cần tạo nó khi khởi động ứng dụng. Trường hợp xấu nhất, bạn sẽ phải phân bổ lại dung lượng lưu trữ cho đối tượng khi cần (thông qua glTexImage2D), nếu bạn cần kích thước khác hoặc thứ gì đó.

+0

Cảm ơn câu trả lời của bạn. Việc gán ID cấu trúc theo cách thủ công sẽ không được đặt câu hỏi, vì chúng tôi cần hỗ trợ OpenGL 1.4 cho tới 3.2. Đặt cược tốt nhất của tôi bây giờ là không xóa kết cấu nào cả. Btw Tôi không thể bỏ phiếu cho câu trả lời của bạn cos Tôi không có đủ điểm. –

+0

@Nicol: Đoạn thứ hai của bạn có vẻ khá * không đầy đủ *. – genpfault

+0

@genpfault: Đã sửa lỗi. Cảm ơn! –

0

Đối với bất kỳ ai có vấn đề này, hãy đảm bảo ngữ cảnh của bạn được khởi tạo hoàn toàn; cho đến khi nó là glGenTextures sẽ luôn luôn trả về 0. Tôi đã không nhận ra những gì đã xảy ra lúc đầu bởi vì có vẻ như 0 vẫn là một ID kết cấu hợp lệ.

Các vấn đề liên quan