2013-07-23 101 views
7

Tôi giả định đây sẽ là một trong những thứ "không xác định", nhưng dường như tôi không tìm được câu trả lời cụ thể từ google.Giá trị mặc định OpenGL cho thuộc tính đỉnh không bị chặn khi sử dụng vòng loại bố cục

Hãy nói rằng trong vertex shader của tôi, tôi có:

layout(location = 0) in vec3 vPosition; 
layout(location = 1) in vec3 vNormal; 
layout(location = 2) in vec4 vColour; 

Nhưng không có gì đệm vào vị trí 2 với glEnableVertexAttribArray() hoặc glVertexAttribPointer() là. Tôi có thể mong đợi giá trị là gì đặc biệt không?

Tôi đã giả định vec4 rằng nó sẽ nằm dọc theo các dòng {0,0,0,0}, {0,0,0,1} hoặc {1,1,1,1}, nhưng trong trường hợp của tôi là {0,0,1,1}.

Khi trước đây tôi sử dụng glBindAttribLocation() để xác định vị trí, nó được mặc định là {1,1,1,1} trên 4 máy khác nhau sử dụng 3 hệ điều hành khác nhau (ubuntu 12.04, windows 7 và ubuntu 10.04).

Có an toàn để giả định giá trị sẽ là {0,0,1,1} trên các máy không? hay chỉ đơn giản là trùng hợp ngẫu nhiên?

Trả lời

5

Tôi có thể mong đợi giá trị là gì đặc biệt không?

Có, đó là một giá trị cụ thể.

Giả sử bạn đúng tắt các mảng thuộc tính (ví dụ: với glDisableVertexAttribArray trên chỉ số thuộc tính), giá trị bạn nhận được xuất phát từ in-context vertex attribute, như theo quy định của bộ glVertexAttrib chức năng. Đây là trạng thái ngữ cảnh toàn cầu, không được lưu trữ trong VAO.

Theo mặc định, tất cả bắt đầu tại (0, 0, 0, 1). Tuy nhiên, nếu bạn đã kết xuất bằng một thuộc tính cụ thể bằng cách sử dụng một mảng trong chỉ mục thuộc tính đó, thì giá trị ngữ cảnh sẽ bị hủy. Vì vậy, bạn nên đặt lại giá trị ngữ cảnh nếu bạn muốn sử dụng nó.

+0

Vì vậy, tôi đã đặt glDisableVertexAttribArray() cho số vị trí cụ thể, nhưng nó vẫn được đọc trong trình đổ bóng là {0,0,1,1}. Tôi đang sử dụng VAO, vì vậy tôi chỉ thực hiện cuộc gọi một lần. Tôi có nên tắt chúng ngay trước khi tôi gọi hàm glDrawElements() thay thế không? – kbirk

+0

@Pondwater: Nếu VAO vô hiệu hóa nó, sau đó nó bị vô hiệu hóa. Bạn không phải tắt nó nữa. Ngoài ra, tôi đã thực hiện một phụ lục cho câu trả lời. –

+0

Ahh có ý nghĩa! Cảm ơn bạn đã làm rõ! – kbirk

1

Chúng không được xác định ở đây, nhưng đó có thể không phải là vấn đề. Trạng thái GL bao gồm các giá trị CURRENT_VERTEX_ATTRIB. Ban đầu, chúng là (0,0,0,1). Bạn có thể thiết lập rõ ràng các giá trị thuộc tính cho những attribs mà không có mảng nào được kích hoạt thông qua họ của các chức năng glVertexAttrib().

Điều duy nhất phải lo lắng là điều gì sẽ xảy ra với các giá trị hiện tại khi mảng thuộc tính thực sự được bật trong khi vẽ. Để trích dẫn Spec (Version 3.3) Mục 2.8.3 Vertex Mảng - Vẽ Command:

Nếu một mảng tương ứng với một thuộc tính chung theo yêu cầu của một vertex shader không được kích hoạt, sau đó các yếu tố tương ứng được lấy từ generic hiện tại trạng thái thuộc tính (xem phần 2.7).

Nếu mảng tương ứng với thuộc tính chung được yêu cầu bởi trình đổ bóng đỉnh được kích hoạt , giá trị thuộc tính chung hiện tại tương ứng không được xác định sau khi thực hiện thực hiện DrawArraysOneInstance.

Vì vậy, bạn chỉ cần chỉ định giá trị hữu ích sau khi bạn đã vẽ với một mảng được bật cho thuộc tính cụ thể đó.

CẬP NHẬT

Hành vi này đã thực sự thay đổi bắt đầu với OpenGL 4.2:

Nếu một mảng tương ứng với một thuộc tính chung theo yêu cầu của một vertex shader được không được kích hoạt, sau đó các yếu tố tương ứng được thực hiện từ thuộc tính chung chung hiện tại trạng thái (xem phần 2.7). Nếu không, nếu một mảng được bật, giá trị thuộc tính chung hiện tại tương ứng là không bị ảnh hưởng bằng cách thực thi DrawArraysOneInstance.

Vì vậy, bây giờ, cuộc gọi glDraw*() sẽ không bao giờ sửa đổi các giá trị thuộc tính hiện được đặt.

+0

"* Chúng là loại không xác định ở đây, nhưng đó có thể không phải là một vấn đề. Có trạng thái GL bao gồm các giá trị CURRENT_VERTEX_ATTRIB. *" Vậy làm thế nào mà làm cho chúng "loại không xác định"? Nó không phải là không xác định nếu spec * định nghĩa chúng *. –

+1

@NicolBolas: Tôi đã đề cập đến thực tế là các giá trị không được xác định sau khi bạn kết xuất với mảng attrib được kích hoạt (theo spec), mà tôi cho rằng OP đang làm, vì nếu không chúng sẽ có giá trị mặc định nếu thậm chí không biết về 'glVertexAttrib'. – derhass

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