2011-01-12 20 views
5

Trong các phiên bản mới ưa thích của OpenGL (3.0 và 4.0 lên), các thuộc tính đỉnh dựng sẵn như gl_Vertex không được dùng nữa. "Cách mới" để thực sự hiển thị mọi thứ là chỉ định các thuộc tính đỉnh của riêng bạn cho vị trí, màu sắc, v.v. và sau đó liên kết các thuộc tính tùy chỉnh này với các bộ đệm.Trình tối ưu OpenGL hiện đại nên được viết như thế nào để tương thích với nhau?

Câu hỏi của tôi là: làm thế nào người ta có thể làm điều này mà không cần kết hợp chặt chẽ mã hiển thị và trình đổ bóng? Nếu tôi viết bóng đổ sử dụng "vị trí" làm vị trí đỉnh, mã máy chủ sử dụng trình đổ bóng phải biết và chuyển dữ liệu đỉnh là "vị trí". Nếu tôi muốn sử dụng một trình đổ bóng khác được viết để lấy dữ liệu đỉnh trong "vertex_pos", trước tiên tôi phải viết lại trình đổ bóng đó hoặc sửa đổi mã máy chủ của tôi để gửi dữ liệu đỉnh như "vertex_pos".

Có tập hợp các tên thực hành tốt nhất cho các thuộc tính đỉnh và phân đoạn tiêu chuẩn mà tất cả các trình đổ bóng nên sử dụng không? Hoặc có các tiêu chuẩn cụ thể cho động cơ Balkanized, sao cho một bóng đổ được viết cho một động cơ không thể hoạt động trên một động cơ khác mà không sửa đổi? Hoặc không có tiêu chuẩn nào cả, như vậy, nói chung, mọi đối tượng đều cần mã hiển thị tùy chỉnh của riêng nó để phù hợp với trình đổ bóng tùy chỉnh của nó?

Trả lời

3

Chỉ cần tiếp tục gọi cho họ tên cũ. Nếu bạn có hồ sơ cốt lõi (nghĩa là không có khả năng tương thích ngược) tên riêng của thông số GLSL cũ hơn được giải phóng được khai báo là không thể xóa; redeclaring chúng cho các thuộc tính vertex ràng buộc. Dường như thay đổi thuộc tính sẵn có của họ. Trong hồ sơ tương thích, các tên biến được preallocated và binded.

Vì vậy, nó tóm tắt điều này: Việc đặt tên cũ trong trình đổ bóng là một sự thuận tiện và có vẻ như hoạt động với các trình biên dịch GLSL hiện tại. Nếu bạn muốn sử dụng bộ tiền xử lý an toàn để ghi lại tiền tố gl_ được đặt trước vào một tiền tố tự chọn và ràng buộc tiền tố đó.

+2

Thực ra, điều đó không đúng. Dự trữ GLSL ** bất kỳ ** tên nào bắt đầu bằng "gl_". Nếu trình biên dịch lõi cho phép bạn sử dụng "gl_Vertex", thì nó không phù hợp với đặc điểm kỹ thuật. Thông số 1.50 làm rõ cú pháp redeclaration vì chỉ hợp lệ để thay đổi các thuộc tính của kiểu khai báo. Vì vậy, nó không nên cho phép bạn redeclare chúng hoặc. –

+0

@Nicol: Bây giờ ở đây bắt đầu pháp luật ngôn ngữ: Một số người có thể thấy tên biến không dùng nữa như định danh được xác định trước từ hồ sơ tương thích và sử dụng chúng trong chương trình 1,35 GLSL là thuộc tính thay đổi quyền sở hữu; IMHO spec là không rõ ràng về điều này, mặc dù §3.3 trên '# version' dường như chỉ ra rằng lõi có nghĩa là" Không có tên tương thích có sẵn ". Nếu muốn an toàn, anh ta có thể sử dụng bộ tiền xử lý '#define gl_Vertex glVertex' và sử dụng tên đó trong cấu hình lõi. – datenwolf

1

Trước tiên, để trả lời câu hỏi của bạn. Tôi không biết về bất kỳ quy ước đặt tên tiêu chuẩn nào như vậy.

Nhưng ... nó phức tạp hơn tên thuộc tính. Ẩn theo câu hỏi là khái niệm ngữ nghĩa thuộc tính. Mỗi thuộc tính đầu vào có một số dạng ngữ nghĩa mà mỗi trình đổ bóng mong đợi.

Và những gì tôi học được từ các tên gl_ cố định là chúng không xác định ngữ nghĩa của chúng.

  • Không gian nào là gl_Position trong? (câu trả lời: nó hoàn toàn phụ thuộc vào thứ mà máy chủ truyền vào. Động cơ không phải truyền vào thứ gì đó là không gian cục bộ, ví dụ nếu nó biến đổi nó vì nó đòi hỏi không gian thế giới vì các lý do khác nhau).
  • là gl_TexCoord1 một tọa độ kết cấu, hoặc thực sự là một tiếp tuyến? những gì về phạm vi của nó? Nó có được mã hóa không?

Không rõ ràng rằng một danh pháp cụ thể có thể được tìm thấy thực sự giải quyết tất cả những vấn đề đó, nhưng nó sẽ được yêu cầu để làm cho các công cụ khác nhau tương thích.

Có vấn đề hơn, thậm chí không rõ ràng một công cụ cụ thể (hoặc tài sản cụ thể) có khả năng cung cấp các thuộc tính cụ thể theo yêu cầu của trình đổ bóng đến từ một công cụ khác. Vậy thì sao?

Đó là tất cả các lý do tại sao chúng tôi kết thúc với môi trường đổ bóng balkanized.

+0

Thông số kỹ thuật OpenGL khá rõ ràng về những gì được truyền qua cũng biết đồng phục và thuộc tính. Những thứ như lạm dụng gl_TexCoord1 để xác định một tiếp tuyến có nguồn gốc trong thời đại, khi chỉ có các thuộc tính đỉnh giới hạn có sẵn và dữ liệu phải được truyền bằng các phương tiện khác. Đối với đầu vào OpenGL 4 không chỉ định bất kỳ tên đặc biệt nào cả, tất cả đều thuộc tính đỉnh tự do có thể đặt tên, nhưng tất nhiên tên đầu ra phải được xác định rõ. Heck, ngay cả các ma trận tiêu chuẩn đã được loại bỏ, bây giờ tất cả các ma trận phải được xác định bởi đồng phục. – datenwolf

+1

@ datenwolf: quan điểm của tôi là, ngay sau khi GL cung cấp shaders, ngữ nghĩa của đầu vào trở thành trách nhiệm của chủ nhà, chứ không phải GL. Điều đó đúng ngay cả khi bạn sử dụng các biến gl_ * và không đảm bảo rằng trình đổ bóng của bạn sẽ hoạt động trên một công cụ khác, ví dụ: Tôi đã nhìn thấy shaders mà thậm chí không tiêu thụ một vị trí, mặc dù nó là cần thiết để được cung cấp. – Bahbar

+0

Mất ngữ nghĩa này là lý do tại sao lõi OpenGL-3/4 không còn có các biến đầu vào được xác định trước đó nữa. Nó chỉ thể hiện các thuộc tính đỉnh chung và bạn được tự do gọi chúng là bất cứ điều gì bạn thích. Tuy nhiên, các Shader được gắn với công cụ render cơ bản của chúng, vì bất kỳ kỹ thuật render tiên tiến nào cũng phụ thuộc vào một số render render, được điều khiển bởi engine. Và các shaders phải viết để phù hợp với những người đi qua. – datenwolf

0

Xem question của tôi để biết danh sách các triển khai có thể có của ngữ nghĩa thuộc tính/đồng nhất. Tôi sợ ngay cả với OpenGL 3.4 vấn đề này sẽ không được giải quyết và bạn còn khá nhiều thiết bị của riêng mình để xác định hợp đồng giữa các trình đổ bóng và mã của bạn.

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