Làm cách nào để chuyển qua tham chiếu trong trình đổ bóng GLSL?Bạn có thể chuyển ma trận bằng cách tham chiếu trong trình đổ bóng GLSL không?
Trả lời
Bạn có thể đánh dấu một thuộc tính như inout
trong chữ ký chức năng, và điều đó sẽ làm cho các thuộc tính một cách hiệu quả "vượt qua bằng cách tham khảo"
Ví dụ,
void doSomething(vec3 trans, inout mat4 mat)
Đây mat
được "thông qua tham khảo" , trans
được chuyển theo giá trị.
mat
phải có khả năng ghi (tức là không phải thuộc tính đồng nhất)
Có thể sử dụng 'inout' trên các yếu tố/sự lộn xộn của các loại hợp chất không? ví dụ. 'void swap (inout float a, inout float b); vec3 foo, bar; hoán đổi (foo.x, bar.x) ' – AkiRoss
Đó là một lời nói dối. "vòng loại tham số chức năng" inout "sẽ dẫn đến hai" bản sao sâu "của dữ liệu của bạn. Đọc tài liệu. https://www.opengl.org/wiki/Core_Language_(GLSL)#Functions Như tôi có thể thấy chỉ có một cách để có được "tham chiếu" thực sự trong glsl, và điều này được cho phép bởi phần mở rộng này: https://www.opengl.org/registry/specs/NV/shader_buffer_load.txt – Crabonog
Đối với bất cứ ai đi qua câu trả lời này trong tương lai, ** IT IS COMPLETELY WRONG **. GLSL không cung cấp cho bạn quyền kiểm soát các thông số chức năng được truyền "dưới mui xe". Thay vào đó, trình biên dịch quyết định ** mọi thứ **, và (hy vọng) không thực sự sao chép mọi thứ thường. Xem [câu trả lời này] (https://stackoverflow.com/a/28577878) để biết thêm chi tiết. – user69513
"Tham chiếu" có ý nghĩa gì ở đây? Mục tiêu là để vượt qua "mà không tạo bản sao sao cho các thay đổi trong tương lai - đối tượng được chia sẻ - sẽ ảnh hưởng đến trình đổ bóng"? –
Nhận xét tuyệt vời. Ý tôi là chính xác ý nghĩa trong C++ hoặc bất kỳ ngôn ngữ lập trình nào khác - __a bản sao cục bộ của tham số được truyền không được thực hiện__. – bobobobo