2017-06-30 2 views
0

WebGL ne prend pas en charge le fonctionnement par bits. Donc, je convertis mon uniforme int en float. Ensuite, utilisez la division et mod pour extraire chaque octet.Comment décompresser chaque octet d'un uniforme int de 4 octets dans WebGL GLSL?

Toutefois, en raison du problème de précision, la conversion int en float perd de la précision si mon int est trop grand. Y a-t-il une solution élégante pour faire face à cela? Actuellement, mon idée ne stocke que 3 octets dans mon uniforme int de 4 octets.

Répondre

0

Ce que vous voulez faire n'est pas clair à 100%. D'abord, réalisez qu'un flotteur de 32 bits a 23 bits de mantisse. C'est un de moins de 3 octets. De plus, votre shader pourrait fonctionner avec moins de précision, comme fp16 ou 8.8 point fixe. Donc, la réponse à votre question est: Non.

Prenez un peu de recul et réfléchissez à la raison pour laquelle vous voulez des ints dans un shader bas de gamme. Habituellement, le tour de passe a été utilisé pour emballer (et déballer) les valeurs flottantes dans et texture rgba bytes ou framebuffer.

Pour les uniformes, cela n'a pas de sens. Le shader fonctionnera toujours avec une précision faible (flottante). Donc tout calcul que vous faites fonctionnera au maximum à 23 bits. Et vous pouvez fournir cela très bien comme un uniforme flottant.

+0

Je souhaite passer un tableau de 1 octet au GPU mais WebGL ne prend pas en charge l'uniformité 1 octet. Je veux donc l'emballer dans un uniforme de 4 octets et le décompresser dans le shader. –

+0

Juste le passer comme un flotteur directement. Si c'est beaucoup d'octets, passez-le comme une texture. Vous pourriez passer 2 octets par uniforme flottant, mais je ne compterais vraiment pas dessus. Vous ne pouvez pas faire plus de 2 octets précisément car les flotteurs ont seulement 23bit de mantisse. – starmole