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
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 vec4
tự độ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.
- 1. Sử dụng IObservable thay vì các sự kiện
- 2. Sử dụng FitNesse thay vì NUnit
- 3. Sử dụng bên ngoài thay vì expand.grid
- 4. lệnh đỉnh cho GPU đang sử dụng CUDA
- 5. Sử dụng cassandra thay vì memcache?
- 6. Sử dụng .DefaultIfEmpty() thay vì .FirstOrDefault() ?? String.Empty;
- 7. sử dụng ExecuteReader thay vì ExecuteNonQuery
- 8. Sử dụng loại tĩnh thay vì biến
- 9. Sử dụng/dev/tcp thay vì wget
- 10. Cách loại bỏ cảnh báo: Sử dụng '$' thay vì '.' cho các lớp bên trong trong Eclipse
- 11. Sử dụng một mảng khác nhau cho các đỉnh và tiêu chuẩn trong glDrawElements (OpenGL/VBOs)
- 12. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 13. Khi nào tôi nên sử dụng các mảng được lập chỉ mục của các đỉnh OpenGL?
- 14. sử dụng: tjump thay vì: thẻ vim trên nhấn Ctrl-]
- 15. Khi nào tôi nên sử dụng UserControl thay vì Trang?
- 16. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 17. Tôi có nên sử dụng String thay vì TFilename không?
- 18. khi nào nên sử dụng index.php thay vì index.html
- 19. Lợi ích của việc sử dụng epoll_create1() thay vì epoll_create()
- 20. Tại sao sử dụng Enums thay vì Constants?
- 21. Khi nào cần sử dụng Helpers thay vì Partials
- 22. sử dụng con trỏ kép thay vì con trỏ đơn
- 23. Những gì để sử dụng thay vì Object.keys()?
- 24. Tôi có thể sử dụng SafeHandle thay vì IntPtr không?
- 25. jQuery - cách sử dụng phương thức "on()" thay vì "live()"?
- 26. Khi nào sử dụng Float32Array thay vì Array trong JavaScript
- 27. Nhược điểm của việc sử dụng NodeJS thay vì PHP
- 28. Làm cách nào để Gson sử dụng các trình truy cập thay vì các trường?
- 29. Sử dụng tính năng tiêm thay vì tiêm xây dựng
- 30. Khi nào tôi sẽ sử dụng XML thay vì SQL?
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
@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. –
@ 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