2014-10-01 183 views
2

我正在開發基於webgl的渲染器,並且標題中說我需要將4位8位無符號整數打包爲32位浮點型,我寫了 下面的代碼:將4位8位無符號整數轉換爲32位浮點型

//pack 4 8-bit integer to a float 
function packIntsToFloat(i1, i2, i3, i4) { 

    //ensure 32-bit allocation 
    var ints = new Uint32Array(4); 

    ints[0] = i1; 
    ints[1] = i2; 
    ints[2] = i3; 
    ints[3] = i4; 

    ints[0] <<= 24; 
    ints[1] <<= 16; 
    ints[2] <<= 8; 

    ints[3] |= ints[0] | ints[1] | ints[2];  

    //convert to float 
    var f = new Float32Array(1); 
    f[0] = ints[3]; 

    return f[0]; 
} 

//unpack 4 8-bit integer from a float 
function unPackIntsFromFloat(f) { 

    var i = new Uint32Array(4); 
    i[3] = f; 

    var mask_7_to_0 = 255; 
    var mask_15_to_8 = mask_7_to_0 << 8; 
    var mask_23_to_16 = mask_15_to_8 << 8; 
    var mask_31_to_24 = mask_23_to_16 << 8; 

    i[0] = (i[3] & mask_31_to_24) >>> 24; 
    i[1] = (i[3] & mask_23_to_16) >>> 16; 
    i[2] = (i[3] & mask_15_to_8) >>> 8; 
    i[3] = (i[3] & mask_7_to_0);   

    return new Uint8Array(i); 
} 

,但它不會,除非跳過工作我需要什麼:

//convert to float 
var f = new Float32Array(1); 
f[0] = ints[3]; 

我知道了IEEE標準的,但不應該有位的任何變化,只有他們的解釋纔是價值。 預先感謝您。

回答

3

所有TypedArray s爲一個類型不可知ArrayBuffer只是意見,所以你可以簡單地使用:

包裝: new Float32Array((new Uint8Array([i1,i2,i3,i4])).buffer)[0];

開箱: new Uint8Array((new Float32Array([f])).buffer);

查看文檔ArrayBufferView欲瞭解更多信息。

+0

非常感謝你!非常非常有幫助,你能解釋一下我寫的代碼嗎? – user2302585 2014-10-02 07:07:56

1

你想要做什麼?

例如你是否試圖將浮點位置和無符號字節顏色放在同一個緩衝區中?在這種情況下,對同一緩衝區製作2個視圖。示例:

var numVerts = 10; 
var bytesPerPosition = 3 * 4; // x,y,z * 4 bytes per float 
var bytesPerColor = 4; // r,g,b,a 1 byte each 
var bytesPerVertex = bytesPerPosition * bytesPerColor; 
var sizeOfBuffer = numVertex * bytesPerVertex; 
var offsetOfPositions = 0; 
var offsetOfColor = bytesPerPosition; 

// now make the buffer. 
var asUint8 = new Uint8Array(sizeOfBuffer); 
var asFloat = new FloatArray(asUint8.buffer); 

您現在有2個視圖到同一緩衝區。因此,例如,設置的位置你會切實做好

var strideInFloats = bytesPerVertex/4; 

function setPosition(index, x, y, z) { 
    var offset = strideInFloats * index; 
    asFloat[offset ] = x; 
    asFloat[offset + 1] = y; 
    asFloat[offset + 2] = z; 
} 

要設置顏色將有效

function setColor(index, r, g, b, a) { 
    var offset = strideInBytes * index + offsetToColor; 
    asUint8[offset ] = r; 
    asUint8[offset + 1] = g; 
    asUint8[offset + 2] = b; 
    asUint8[offset + 3] = a; 
} 

當設置的屬性,你會做這樣的事情

gl.vertexAttribPointer(positionLoc, 3, gl.FLOAT, false, bytesPerVertex, 
         offsetOfPosition); 
gl.vertexAttribPointer(colorLoc, 4, gl.UNSIGNED_BYTE, true, bytesPerVertex, 
         offsetOfColor); 
相關問題