2012-07-26 27 views
6

Tôi đang cố chuyển đổi chương trình của tôi từ GLfloat sang GLshort cho các vị trí đỉnh và tôi không chắc chắn cách thể hiện điều này trong trình đổ bóng. Tôi đã sử dụng một datatype vec3 trong shader nhưng vec3 đại diện cho 3 float. Bây giờ tôi cần phải đại diện cho 3 quần short. Theo như tôi có thể nói OpenGL không có một véc tơ cho quần short vì vậy tôi phải làm gì trong trường hợp này?Sử dụng GLshort thay vì GLfloat cho các đỉnh

Trả lời

16

Tôi không chắc chắn cách thể hiện điều này trong trình đổ bóng.

Đó là vì thông tin này không có trong trình đổ bóng.

Tất cả các giá trị được cung cấp bởi glVertexAttribPointer sẽ là chuyển đổi thành giá trị GLSL dấu phẩy động (nếu chúng chưa nổi). Chuyển đổi này về cơ bản là miễn phí. Vì vậy, bạn có thể sử dụng bất kỳ các glVertexAttribPointer định nghĩa với một loại vec4 thuộc tính:

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...); 
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...); 

Tất cả trong số này sẽ được chuyển đổi thành một vec4tự động. Trình đổ bóng của bạn không phải biết hoặc quan tâm rằng nó đang được cho ăn quần short, byte, số nguyên, phao, v.v.

Giá trị đầu tiên sẽ được sử dụng. Chế độ thứ hai sẽ chuyển đổi phạm vi ngắn chưa được ký [0, 65535] thành phạm vi dấu phẩy động [0.0, 1.0]. Thứ ba sẽ chuyển đổi phạm vi ngắn đã ký [-32768, 32767] thành phạm vi [-1.0, 1.0] (though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0). Thứ tư sẽ chuyển đổi [-32768, 32767] thành [-32768.0, 32767.0], thành một phạm vi dấu phẩy động.

Loại GLSL bạn sử dụng cho các thuộc tính chỉ thay đổi nếu bạn sử dụng glVertexAttribIPointer hoặc glVertexAttribLPointer, không có sẵn trong OpenGL ES 2.0.

Tóm lại: bạn nên luôn sử dụng loại GLSL nổi cho thuộc tính. OpenGL sẽ thực hiện chuyển đổi cho bạn.

+0

Tôi đã có ấn tượng sau khi đọc câu trả lời tại: http://stackoverflow.com/a/1316494/256062 và http://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier: Bạn đang thiếu điểm. Kích thước của dữ liệu đỉnh của bạn được xác định bởi 'glVertexAttribPointer', * không * biến thuộc tính GLSL. Bạn không * cần * để đại diện cho các thành phần nhỏ hơn trong trình đổ bóng; phần cứng sẽ * chuyển đổi * từ các thành phần nhỏ hơn thành các thành phần lớn hơn. –

+0

@ nicol-bolas Đối với các kiểu dữ liệu đã ký, bạn có chắc là phạm vi được chuyển đổi không (ví dụ: 'short')' [-32768, 32767] 'và không' [-32767, 32767] '? [Bài báo] này (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), được cho là lấy từ Sách Cam, dường như dạy khác nhau. Nó nói rằng việc chuyển đổi chỉ là một bộ phận cho các loại đã ký. Trong trường hợp đó, giá trị ngắn '-32768' sẽ được chuyển thành giá trị GLSL điểm động' -32768/32767 = -1.000305185..'. Tôi không thể tìm thấy trong spec để xác định đó là chính xác. – wil

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