Tại sao sử dụng glReadBuffer / glReadPixels trả về hình ảnh màu đen trên thẻ Intel?


8

Tôi có đoạn mã này

glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); 

Nó hoạt động hoàn hảo trong tất cả các GPU Nvidia và AMD mà tôi đã thử, nhưng nó đã thất bại trong hầu hết mọi video tích hợp Intel mà tôi đã thử. Nó thực sự hoạt động trong một 945GME rất cũ, nhưng thất bại trong tất cả những cái khác. Thay vì nhận được một ảnh chụp màn hình, tôi thực sự nhận được một màn hình đen.

Nếu nó giúp, tôi đang làm việc với Doom3 Engine và mã đó được lấy từ mã chụp màn hình tích hợp. Nhân tiện, ngay cả với trò chơi gốc, tôi cũng không thể chụp màn hình trên các thiết bị intel đó. Tôi đoán là họ không thực hiện đúng tiêu chuẩn hoặc một cái gì đó. Có một cách giải quyết cho điều này?


1
Bạn có thể cho chúng tôi một vài ví dụ cụ thể về chipset video tích hợp của Intel bị lỗi không? Chỉ để chúng tôi chắc chắn rằng chúng tôi đang nói về cùng một điều. (Mã của tôi trông rất giống mã của bạn, tình cờ)
Trevor Powell

Tôi đã sử dụng Intel 945.965, GMA HD và cả hai đều không hoạt động. Họ đã ở trong một số nguồn cảm hứng 1525, một người khác từ một Inspiron 1764. Người đã làm việc là một chiếc Intel 950 rất cũ từ Acer Aspire One 110L. Bạn có thể sửa nó không?
cloudraven

3
Có lẽ bạn cần đọc từ bộ đệm GL_BACK? Các trang web OpenGL cho biết đó là mặc định cho chế độ đệm đôi. Nhưng để tham khảo, mã ở trên (với GL_FRONT hoặc GL_BACK) đã hoạt động trên thẻ Intel HD của tôi.
QuasarDonkey

Tôi sẽ thử vào ngày mai. Thật kỳ lạ, đó không phải là hành vi không xác định? Chà, tôi có thể làm cho nó chỉ xảy ra trên thẻ intel.
cloudraven

Cloudraven, tôi sẽ kiểm tra RB_ExecuteBackEndCommands từ tr_backend.cpp cho các trường hợp bộ đệm backbuffer có thể bị xóa trước cuộc gọi ReadPixels của bạn.
Jing

Câu trả lời:


4

Đồ họa Intel trong lịch sử luôn có vấn đề với việc đọc từ hoặc vẽ lên bộ đệm phía trước. Một nguyên tắc nhỏ mà tôi tuân theo với Intel là - nếu bạn không thể làm điều đó trong D3D thì thậm chí đừng cố gắng làm điều đó trong OpenGL, ngay cả khi thông số kỹ thuật nói rằng bạn sẽ có thể - và D3D không cho phép truy cập vào bộ đệm phía trước theo cách này vì vậy ... chỉ cần sử dụng GL_BACK thay thế.


Vâng, tôi thích sử dụng GL_BACK, nhưng GL_FRONT. Chỉ là GL_BACK không hoạt động. Hài hước lắm, GL_FRONT dường như hoạt động, nhưng tôi chưa kiểm tra kỹ.
cloudraven
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.