Hơn nữa, chúng ta có một gl_FragColor được xác định trước.
Hãy bắt đầu với điều này. Không, bạn không có xác định trước gl_FragColor
. Điều đó đã bị xóa khỏi OpenGL 3.1 cốt lõi trở lên. Trừ khi bạn đang sử dụng khả năng tương thích (trong trường hợp đó, bộ đổ bóng 3,30 của bạn sẽ nói #version 330 compatibility
ở trên cùng), bạn không bao giờ nên sử dụng cái này.
Bây giờ, quay lại kết quả đầu ra của trình đổ bóng phân đoạn do người dùng xác định. Nhưng trước tiên, một phép loại suy nhanh.
Hãy nhớ làm thế nào, trong bộ đổ bóng đỉnh, bạn có đầu vào? Và những đầu vào đại diện cho đỉnh chỉ số thuộc tính, các số bạn vượt qua glVertexAttribPointer
và glEnableVertexAttribArray
và vân vân? Bạn thiết lập đầu vào nào lấy từ thuộc tính nào. Trong GLSL 3.30, bạn sử dụng cú pháp này:
layout(location = 2) in color;
Điều này đặt color
đầu vào bộ đổ bóng đỉnh đến từ vị trí thuộc tính 2. Trước 3.30 (hoặc không có ARB_explicit_attrib_location), bạn sẽ phải thiết lập điều này một cách rõ ràng với glBindAttrbLocation
trước khi liên kết hoặc truy vấn chương trình cho chỉ mục thuộc tính với glGetAttribLocation
. Nếu bạn không cung cấp một cách rõ ràng một vị trí thuộc tính, GLSL sẽ chỉ định một vị trí tùy ý (nghĩa là: theo cách được triển khai xác định).
Đặt nó trong shader hầu như luôn là lựa chọn tốt hơn.
Trong mọi trường hợp, kết quả đầu ra của bộ đổ bóng phân mảnh hoạt động gần như giống hệt nhau. Trình tạo bóng phân mảnh có thể ghi vào nhiều màu đầu ra , bản thân chúng sẽ được ánh xạ tới nhiều bộ đệm trong bộ đệm khung . Do đó, bạn cần chỉ ra đầu ra nào chuyển sang màu đầu ra phân mảnh nào.
Quá trình này bắt đầu với giá trị vị trí đầu ra phân mảnh. Nó được đặt rất giống với các vị trí đầu vào của trình đổ bóng đỉnh:
layout(location = 1) out secColor;
Ngoài ra còn có các hàm API glBindFragDataLocation
và glGetFragDataLocation
tương tự với glBindAttribLocation
và glGetAttribLocation
.
Nếu bạn không thực hiện bất kỳ nhiệm vụ rõ ràng nào, việc triển khai thường sẽ gán một trong các biến đầu ra của bạn cho vị trí 0. Tuy nhiên, tiêu chuẩn OpenGL không yêu cầu hành vi này, vì vậy bạn cũng không nên phụ thuộc vào nó.
Công bằng mà nói, chương trình của bạn lẽ ra đã không liên kết được khi bạn sử dụng hai đầu ra không có vị trí đầu ra khác nhau. Điều có thể đã xảy ra là trình biên dịch của bạn đã tối ưu hóa thứ mà bạn không viết ra, vì vậy nó đã quên mất nó khi đến lúc kiểm tra lỗi trình liên kết.