2017-11-10 16 views
0
I가 WebGL이있는 후자의 회수를위한 Float32Array(3)로 (24 비트 범위에 포함되는 값이다) id 기억하고

: 완전성을 위해서스크립트 변환

var r = 0, 
    g = 0, 
    b = id; 
if (b >= 65536) { 
    r = ~~(b/65536); 
    b -= r * 65536; 
} 
if (b >= 256) { 
    g = ~~(b/256); 
    b -= g * 256; 
} 
var fa = new Float32Array([r/255, g/255, b/255]); 

여기

gl.uniform3fv(uniforms['u_id'], fa); 

...이 내가 WebGLRenderingContext.readPixels()에서 내 id 돌아갈 방법은 다음과 같습니다 : 내가 그 값을 사용하고 어떻게

var result = new Uint8Array(4); 
gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, result); 
var id = result[0] << 16 | result[1] << 8 | result[2]; 

그 값을 내 Float32Array으로 분할하는 올바른 방법은 무엇입니까? 나는 그런 일이보다 효율적이고 우아한 방식으로 이루어질 수 있다고 믿는다. (사실, 내가하고있는 일은 일하고 있지만 내 눈을 아프게한다.)

+0

무엇의 정의 "효율적"하고 질문에 "우아한"? – guest271314

+0

'if'가없는 경우, 어쩌면 비트 쉬프트 사용 – deblocker

+0

만약'b '가'if (b> = 65536)에서'65536'보다 크다면 {'b'' 또한' if (b> = 256) {', 그렇습니까? – guest271314

답변

1

id 이런 형태 가지고

0000 0000 rrrr rrrr gggg gggg bbbb bbbb 

부분 (R, G 또는 B)를 최하위 바이트에 넣어 멀리 나머지 마스킹하여 추출 할 수있다. 때때로 그러한 단계 중 하나가 불필요합니다. 그래서 :

b = id & 255 // b is already in the low byte, so no shift 
g = (id >> 8) & 255 
r = id >> 16 // no mask because there is nothing "above" r 

이 분할 함께 넣어 될 수 있으며, 배열에 넣어 :

[(id >> 16)/255, ((id >> 8) & 255)/255, (id & 255)/255]