OpenGLES:如何获取int

时间:2015-07-24 01:10:44

标签: android opengl-es

我正在尝试将16位整数拆分为两个无符号字节,然后在着色器内重新组合它们以用作位置。但是,OpenGLES保留&和<<,所以我不得不想出几个技巧来检索每个部分。

precision highp float;

uniform sampler2D u_Positions;
uniform sampler2D u_Velocities;

// uniform vec2 vpSize;

void main() {
    vec2 coord = gl_FragCoord.xy / vec2(256.0, 256.0);
    vec4 position = texture2D(u_Positions, coord);
    vec4 velocity = texture2D(u_Velocities, coord);
    vec2 real_Position = vec2((position.r * 256.0 * 256.0) + (position.g * 256.0),(position.b * 256.0 * 256.0) + (position.a * 256.0));
    real_Position.x += ((velocity.r * 256.0) + velocity.g) * 256.0;
    real_Position.y += ((velocity.b * 256.0) + velocity.a) * 256.0;
    vec4 color = vec4(1.0);
    color.r = float(int(real_Position.x) / 256) / 256.0;
    color.g = mod(real_Position.x, 256.0) / 256.0;
    color.b = float(int(real_Position.y) / 256) / 256.0;
    color.a = 1.0;
    gl_FragColor = color;
}

所以我将红色分量乘以256使其在1-256的范围内,然后乘以256将其移至左边8位。然后我对下半部分做同样的操作而不移动然后将它们加在一起

然而,我遇到的问题是转换回[0,1]范围。上半部分我只是向右移动8位然后除以256.然而对于下半部分,因为没有,我使用模256得到较低的8.但由于某种原因,我最终得到随机1的附加到它

所以我想用960作为我的x组件我最终得到3红色195绿色而不是192绿色。如果我想使用0,我最终将我的位置设为1.低8位关闭。我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你必须乘以255而不是256(在某些情况下)。为什么?因为如果将[0,1]值范围乘以256,则得到[0,256]值范围 - > 257个人值 - >溢出(最大0的8位数是255)

编辑:看起来像是经典的一次性错误。如果将[0,256]范围除以256,则得到[1 / 256,1]范围。例如。

color.r = float(int(real_Position.x) / 256) / 255.0;
在这种情况下,

应该是正确的计算。另外,如果将[0,1]值乘以256并将该值赋值给一个字节,结果将相同,直到您实际命中1,其中该字节将再次为0。为什么? (254/255)* 256 = 254.99 = 254(因为int舍入),但是1 * 256 = 256(字节范围是[0,255])。因此,无论您在颜色[0,1]浮点数和字节之间进行转换,都必须乘以/除以255,而在8位和16位值之间进行转换时,必须乘以/除以256。

在一般方程中:

lb=w%256    //lower byte from 16bit
hb=w/256    //higher byte from 16bit
w=lb+hb*256 //16bit from bytes
b=f*255     //byte from [0,1] float (0->0, 1->255)
f=b/255.0   //[0,1] float from byte (0->0, 255->1)