2011-09-17 3 views
6

Tôi đã lướt qua các thông số kỹ thuật và OpenGL diễn đàn nhưng có thể không thực sự có ý nghĩa của việc này:* BaseVertex và gl_VertexID

Are phiên bản *BaseVertex của các lệnh vẽ phải thêm vào biến GLSL gl_VertexID? Vì nó hoạt động, gl_VertexID chứa chỉ mục được lấy từ các ràng buộc ELEMENT_ARRAY_BUFFER trước khi basevertex được thêm vào nó.

Vì vậy, câu hỏi của tôi là: Đây có phải là hành vi đúng không? Tôi giả định rằng gl_VertexID phải chứa chỉ mục được sử dụng để tìm nạp đỉnh.

Trả lời

4

Vâng đây là bahviour chính xác. Kịch bản sử dụng của BaseVertex là, bạn phải chuyển đổi chỉ một giá trị này, thay vì điều chỉnh các offset bộ đệm thành các mảng đỉnh với các hàm gl*Pointer.

Ý tưởng là, bạn có thể tải dữ liệu từ nhiều lưới (tệp mô hình) vào một VBO đơn, mà không cần điều chỉnh chỉ mục.

+0

Aye, có ý nghĩa. Tôi đoán một cái gì đó như "' gl_Element' "- mà sẽ chứa các chỉ số tính toán cuối cùng - sẽ là một bổ sung tốt cho' gl_VertexID' trong một số phiên bản tương lai của OpenGL/GLSL. Cảm ơn bạn. – palle8x

+0

@ palle8x Tôi không nghĩ vậy, vì chỉ mục từ mảng phần tử quan trọng hơn, khái niệm. Và bạn chỉ có thể thêm một bộ đồng phục cho baseVertex và thêm nó vào 'gl_VertexID', nếu bạn thực sự cần nó. –

+0

Tôi đồng ý và những gì bạn mô tả là những gì tôi hiện đang làm trong mã của mình. Nhưng tôi vẫn nghĩ rằng có một trường hợp sử dụng hợp lệ cho một cái gì đó như "' gl_Element' ", và (tôi tin) nó sẽ không quá khó để thực hiện trong trình điều khiển. – palle8x

0

Giả định của bạn là đúng. gl_VertexID nên bao gồm BaseVertex offset.

opengl wiki about GLSL built-in vars:

Lưu ý: gl_VertexID sẽ có đỉnh cơ sở áp dụng cho nó.

about glDrawElementsBaseVertex:

Các gl_VertexID truyền cho Vertex Shader sẽ là chỉ số sau khi được bù đắp bởi basevertex, không phải là chỉ số lấy từ bộ đệm.

Thật không may, một số trình điều khiển cũ không triển khai chính xác.