Abd*_*hab 10 javascript html5 opengl-es webgl
有没有办法让浏览器返回opengl版本字符串?
我知道opengl不是由浏览器执行的,这就是为什么在代码中,着色器被写为字符串以不会导致javascript语法错误,
那么,如果浏览器可以与GPU交互,那么必须有一些代码将字符串返回到控制台而不是着色器?
简短的回答是,你做不到.您可以要求标准GL版本.
const gl = document.createElement("canvas").getContext("webgl");
console.log(gl.getParameter(gl.VERSION));
console.log(gl.getParameter(gl.SHADING_LANGUAGE_VERSION));
console.log(gl.getParameter(gl.VENDOR));Run Code Online (Sandbox Code Playgroud)
但目前他们需要在WebGL的所有实现上返回类似的值.例如,在我的机器上他们返回
WebGL 1.0 (OpenGL ES 2.0 Chromium)
WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)
WebKit
Run Code Online (Sandbox Code Playgroud)
分别.
他们应该返回这些特定值的原因是出于隐私原因.如果您能找到某人GPU的供应商,那么您可以将其用作更多信息来识别它们.(有关使用浏览器信息唯一标识特定计算机的示例,请参阅https://panopticlick.eff.org/.)
Apple甚至指出,如果你知道GPU的供应商和型号,那么你可以知道是否有人最近购买了MacPro,因为MacPro的GPU没有其他地方可用.例如,您可以定位广告."嘿,我看到你的GPU上有7000美元的电脑.你觉得这个昂贵的度假套餐怎么样?"
另一方面,谷歌已经决定他们不认为这是一个问题,所以他们决定打开原本应该享有特权的WebGL扩展(意味着只能通过特殊的启用来测试等).该扩展名是WEBGL_debug_renderer_info扩展名(http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/)
要首先使用它,您必须检查它是否可用,如果可用,您可以获得实际的供应商和渲染器.
// try to get the extensions
const ext = gl.getExtension("WEBGL_debug_renderer_info");
// if the extension exists, find out the info.
if (ext) {
console.log(gl.getParameter(ext.UNMASKED_VENDOR_WEBGL));
console.log(gl.getParameter(ext.UNMASKED_RENDERER_WEBGL));
}
Run Code Online (Sandbox Code Playgroud)
当我在我的机器上运行时,我得到了
NVIDIA Corporation
NVIDIA GeForce GT 650M OpenGL Engine
Run Code Online (Sandbox Code Playgroud)
const gl = document.createElement("canvas").getContext("webgl");
// try to get the extensions
const ext = gl.getExtension("WEBGL_debug_renderer_info");
// if the extension exists, find out the info.
if (ext) {
console.log(gl.getParameter(ext.UNMASKED_VENDOR_WEBGL));
console.log(gl.getParameter(ext.UNMASKED_RENDERER_WEBGL));
}Run Code Online (Sandbox Code Playgroud)
注意:最近检查2017年8月1日这在Firefox 54,Safari 10.1.2,Chrome 59中可用,所以我想其他浏览器已经认定它很重要