2011-10-12 44 views
5

Từ phần 5,8 của The OpenGL® ES Shading Language (v1.00, r17) [PDF] (tôi nhấn mạnh):Bạn có thể sử dụng glVertexAttribPointer để gán một véc tơ nhỏ hơn cho một véc tơ lớn hơn không?

Toán tử gán lưu trữ các giá trị của rvalue thể hiện vào vế trái và trả về một rvalue với loại và độ chính xác của vế trái thể hiện . Biểu thức lvalue-expression và rvalue-expression phải có cùng loại. Tất cả các loại chuyển đổi mong muốn phải được chỉ định rõ ràng thông qua một hàm tạo.

Vì vậy, nó có vẻ như đang làm một cái gì đó như thế này sẽ không là hợp pháp:

vec3 my_vec3 = vec3(1, 2, 3); 
vec4 my_vec4 = my_vec3; 

Và để làm cho nó hợp pháp dòng thứ hai sẽ phải được cái gì đó như:

vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component 

Tôi giả định rằng glVertexAttribPointer có các yêu cầu tương tự. Tức là, nếu bạn chỉ định cho một số vec4 thì thông số size sẽ phải bằng 4.

Sau đó, tôi xem qua số GLES20TriangleRenderer sample for Android. Một số đoạn có liên quan:

attribute vec4 aPosition; 

maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); 

GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 
     TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 

Vì vậy aPosition là một vec4, nhưng cuộc gọi đến glVertexAttribPointer được dùng để thiết lập nó có một size của 3. mã này đúng, là GLES20TriangleRenderer dựa vào hành vi không xác định, hoặc là có cái gì khác Tôi đang mất tích?

Trả lời

10

Kích thước của dữ liệu thuộc tính được chuyển đến trình đổ bóng không phải khớp với kích thước của thuộc tính trong trình đổ bóng đó. Bạn có thể chuyển 2 giá trị (từ glVertexAttribPointer) đến một thuộc tính được xác định là vec4; hai giá trị còn lại là số không, ngoại trừ thành phần W là 1. Và tương tự, bạn có thể chuyển 4 giá trị thành thuộc tính vec2; các giá trị thừa được loại bỏ.

Vì vậy, bạn có thể trộn và đối sánh các thuộc tính đỉnh với các giá trị được tải lên tất cả những gì bạn muốn.

+0

Thú vị. Hành vi này có được ghi lại ở đâu đó không? –

+0

@LaurenceGonsalves: Tài liệu được mô tả trong đặc tả OpenGL ES. –

+6

Tôi đã hy vọng điều gì đó cụ thể hơn một chút. :-) Đối với bản ghi, điều này dường như được ghi lại trong phần 2.8 của spec, "Vertex Arrays", dưới tiêu đề "Transferring Array Elements". –

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