我有一个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