我有一個short
的質感,我想從着色器來閱讀,WebGL的不支持short
紋理,所以我分裂短到兩個字節,並將其發送到着色器:短紋理的WebGL
var ushortValue = reinterval(i16Value, -32768, 32767, 0, 65535);
textureData[j*4] = ushortValue & 0xFF; // first byte
ushortValue = ushortValue >> 8;
textureData[j*4+1] = ushortValue & 0xFF; // second byte
textureData[j*4+2] = 0;
textureData[j*4+3] = 0;
然後我把數據上傳至顯卡:
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureData);
在片段着色器:
vec4 valueInRGBA = texture2D(ctTexture, xy)*255.0; // range 0-1 to 0-255
float real_value = valueInRGBA.r + valueInRGBA.g*256;
real_value = reinterval(real_value , 0.0, 65535.0, 0.0, 1.0);
gl_FragColor = vec4(real_value, real_value, real_value, 1.0);
但是,與我在正常的opengl中上傳支持短紋理的短數據時相比,我的分辨率已經丟失了。任何人都可以看到我做錯了什麼?
這裏是另外一個陌生的不同的WebGL我和OpenGL之間獲取,使用相同的數據。我繪製了上面的值我得到了相同的顏色,但我的分辨率稍差。然後我添加兩行:
ct_value = reinterval(ct_value, 0.0, 65535.0, -32768.0, 32767.0);
ct_value = reintervalClamped(ct_value, -275.0, 475.0, 0.0, 1.0);
gl_FragColor = vec4(ct_value,ct_value,ct_value,1.0);
在OpenGL一切看起來不錯,但在WebGL的一切都變成白色的確切相同的代碼。
的Opengl: 的WebGL:
不應該在着色器中乘以255.0(2^8-1)而不是254.0? – BDL 2014-10-16 11:29:55
甚至* 256 *,因爲'ushortValue = ushortValue >> 8;'除以 – 2014-10-16 11:31:35
我改變了它,謝謝,但仍然是,分辨率仍然不好 – hidayat 2014-10-16 11:41:12