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?
Thú vị. Hành vi này có được ghi lại ở đâu đó không? –
@LaurenceGonsalves: Tài liệu được mô tả trong đặc tả OpenGL ES. –
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". –