2010-11-06 50 views
5

Tôi đang viết chương trình OpenGL vẽ vào Bộ đệm phụ, khi đó nội dung của Bộ đệm phụ được tích lũy vào Bộ đệm tích lũy trước khi được GL_RETURN-ed vào bộ đệm Quay lại (về cơ bản được tổng hợp cho màn hình). Trong ngắn hạn, tôi đang làm một loại chuyển động mờ. Tuy nhiên điều kỳ lạ là, khi tôi biên dịch lại và chạy lại chương trình của mình, tôi đã thấy nội dung của Auxiliary/Accumulation Buffer từ chương trình trước đó chạy. Điều này không có ý nghĩa. Tôi có hiểu nhầm điều gì đó, không nên trạng thái OpenGL được đặt lại hoàn toàn khi chương trình khởi động lại?Trạng thái của bộ đệm OpenGL có thể tồn tại như thế nào giữa các lần chạy chương trình?

Tôi đang viết một chương trình SDL/OpenGL trong Drivers Gentoo Linux nVidia 195.36.31 trên GeForce Go 6150.

Trả lời

10

Không - không có lý do cho GPU của bạn bao giờ rõ ràng bộ nhớ của nó. Đó là trách nhiệm của bạn để xóa (hoặc khởi tạo) kết cấu của bạn trước khi sử dụng chúng.

+0

Cảm ơn, ít nhất là bây giờ tôi biết rằng nó không phải là một hành vi bất ngờ, mặc dù nó chỉ là đáng sợ ... –

+1

Tôi đồng ý. Muốn thêm: theo một số điều kiện trình điều khiển video được yêu cầu để zero-init cấp phát bộ nhớ, vì cân nhắc "an ninh" (chương trình ác có thể muốn biết những gì người khác đang vẽ). Điều này là vô lý (tôi muốn nói rằng nên là trách nhiệm của chương trình đó muốn che giấu đầu ra trung gian của nó), nhưng đây là cách mọi thứ. – valdo

+1

Tôi đã làm rất nhiều Direct3D thông qua kỷ nguyên DirectX9. Khi tôi bắt đầu, framebuffers, bề mặt vv luôn luôn sẽ được uninitialized và mã có thể dễ dàng phơi bày các nội dung của một chạy trước đó. Tại một số điểm, hoặc Microsoft hoặc các nhà cung cấp trình điều khiển phải có quyết định "sửa chữa" này và bạn sẽ nhận được đệm bộ đệm thay thế. Tôi tin rằng nó đã được thực hiện trong tên của an ninh. Tôi muốn nói rằng các mối quan tâm về bảo mật là hợp lệ; chúng tôi sẽ không tha thứ cho một hệ thống các quy trình sử dụng tay RAM chứa các mảnh vụn không tan khác của người dùng và RAM đệm khung không nên được coi cách khác nhau. – timday

5

Thực tế, trạng thái OpenGL OpenGL được khởi tạo cho các giá trị được xác định rõ. Tuy nhiên, trạng thái GL bao gồm các cài đặt như tất cả các công tắc nhị phân (glEnable), pha trộn, chế độ kiểm tra độ sâu ... v.v ... Mỗi thiết bị có cài đặt mặc định, được mô tả trong OpenGL specs và bạn có thể chắc chắn rằng chúng sẽ được thực thi khi tạo ngữ cảnh.

Vấn đề là, bộ đệm khung (hoặc dữ liệu kết cấu hoặc bộ đệm đỉnh hoặc bất kỳ thứ gì) KHÔNG phải là một phần của cái được gọi là "trạng thái GL". Trạng thái GL "tồn tại" trong trình điều khiển của bạn. Những gì được lưu trữ trong bộ nhớ GPU là hoàn toàn khác nhau và nó là uninitialized cho đến khi bạn yêu cầu trình điều khiển (thông qua các cuộc gọi GL) để khởi tạo nó. Vì vậy, nó hoàn toàn có thể có phần còn lại của chạy trước trong bộ nhớ kết cấu hoặc thậm chí trong bộ đệm khung chính nó nếu bạn không rõ ràng hoặc khởi tạo nó lúc khởi động.

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