2015-09-14 36 views
2

有方法來創建僅具有單一組分的浮點值的每個像素的紋理? 我想繪製陰影貼圖到紋理中,我不想使用深度格式的擴展名,因爲它不適用於多緩衝區繪圖。單組分紋理浮子

我知道我可以使用UBYTE RGBA紋理和分裂浮點值,每個顏色,但我怕的就是這個解決方案的性能效果。

我知道有在OpenGL 4紋理格式gl.RED,如果有這樣的紋理格式很適合這個situation.But看來WebGL的不具備這樣的功能。 首先,我認爲gl.ALPHA就是這樣,但它看起來不同。 gl.LUMINANCE也顯得不同。

有什麼辦法才達到浮紋的單組分中的WebGL?

+0

什麼導致你相信用'depth_texture'擴展是壞的多緩衝器繪製? –

+0

如果是彩色紋理類型,它可以用於多個目標。但是,我不認爲深度緩衝區可以接受多個紋理。 – kyasbal

+0

您可以啓用'OES_texture_float'然後創建'gl.LUMINANCE,gl.FLOAT'或'gl.ALPHA,gl.FLOAT'紋理。不''OES_texture_float'幾乎只在桌面機器上可用,而不是移動的。 – gman

回答

1

包浮子成RGBA通道。只需使用標準的8位每通道rgba紋理。

"vec4 pack_float(float f){", 
    " const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);", 
    " const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);", 
    " vec4 res = fract(f * bit_shift);", 
    " res -= res.xxyz * bit_mask;", 
    " return res;", 
    "}", 

"float unpack_float(vec4 rgba){", 
    " const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);", 
    " float res = dot(rgba, bit_shift);", 
    " return res;", 
    "}", 
+0

如果我只需要rgb(24bit),我可以使用pack_float(SOMETHING).gba作爲打包值,對吧? – kyasbal

+0

我相信如此,但我從來沒有嘗試過。儘管如果你想要24位深度緩衝區,爲什麼不直接輸出到depth_texture?僅供參考多重渲染輸出涉及多種顏色紋理,但如果啓用了擴展功能,則始終可以輸出到深度紋理。 –

+0

通過使用多個渲染目標,我認爲它會對性能有好處。但是,深度紋理無法附加到ColorTarget的權利?所以,我認爲我不能在繪圖調用中多次使用深度紋理。 – kyasbal