Tôi đã trang bị cho động cơ của mình mã kiểm tra lỗi. Tôi sẽ cố gắng mô tả tình huống này với khả năng tốt nhất của tôi. Bất cứ khi nào tôi tải một shader và có lỗi (tập tin không tồn tại, lỗi biên dịch, bất cứ điều gì có thể sai) tôi xóa shader và đặt con trỏ về 0 (không thể nghĩ ra cách nào để đảm bảo rằng tôi không cố gắng đính kèm hoặc xóa rác một cách tình cờ). Tôi không muốn dừng chương trình nếu điều này xảy ra, bởi vì ai đó có thể xóa hoặc sửa đổi một tệp một cách tình cờ trong thư mục trò chơi và không muốn làm cho toàn bộ trò chơi không thể sử dụng được vì điều đó.
Bây giờ vấn đề là, có một hành vi mặc định trong tình huống tôi gắn shader vào một chương trình có con trỏ bằng 0 không?
Trong chương trình của tôi, nếu tôi đính kèm một shader đỉnh bằng 0 và shader mảnh bằng 0, thì OpenGL sẽ sử dụng chương trình mặc định (sẽ hiển thị mọi thứ màu trắng):
Đây là một khối được xoay mà kích thước đã có trong không gian clip, được hiển thị mà không cần chiếu phối cảnh hoặc kiểm tra độ sâu. Nó được tải từ tệp .obj.
Bây giờ, nếu tôi đính kèm một shader mảnh thích hợp, nhưng shader đỉnh sẽ là 0, tôi nhận được điều này:
Đó là những gì tôi mong đợi, tất cả các shader mảnh làm ra một vec4 (1.0, 0.3, 0.7, 1.0), không có shader đỉnh nên OpenGL sử dụng mặc định (đây có phải là giả định chính xác không?).
Tuy nhiên, bây giờ, nếu tôi đính kèm một shader đỉnh chính xác, nhưng tôi đính kèm một shader mảnh bằng 0 (hoặc tôi sẽ không đính kèm một shader mảnh nào cả) tôi sẽ gặp rắc rối này:
Một cái gì đó bạn không thể nhìn thấy là mô hình này liên tục được sơn các màu khác nhau, vì vậy trên màn hình của tôi, nó trông giống như một chuyến đi axit với các đường ngang màu đen đi qua.
Tôi bối rối một chút, vì tôi sẽ mong khối lập phương chỉ có màu trắng. Tôi muốn chỉ ra rằng mã shader của tôi là xương trần, tôi không trao đổi bất kỳ biến nào giữa các shader đỉnh và mảnh. Kiểm tra xem con trỏ có bằng 0 không thay đổi gì không, chương trình được liên kết hoạt động giống như khi tôi đưa cho nó một con trỏ bằng 0. Điều kỳ lạ nhất với tôi là nó luôn được tô bóng đẹp, nó không chỉ là rác.
EDIT: Có lẽ shader mảnh mặc định mong đợi một giá trị gl_ từ đỉnh mà tôi đang đặt ra? Điều đó sẽ giải thích lý do tại sao bề mặt được tô bóng đẹp mắt, shader mảnh vỡ mong đợi sự trơn tru, nhưng giá trị đó chỉ là rác, vì tôi đã không đặt nó.
Bây giờ đây có phải là "hành vi không xác định" hay đây là cách nó hoạt động tốt?