itowns
Version:
A JS/WebGL framework for 3D geospatial data visualization
47 lines • 2 kB
JavaScript
/* babel-plugin-inline-import '../../Renderer/Shader/SampleTestFS.glsl' */
const SampleTestFS = "uniform sampler2D uni[SAMPLE];\nvoid main() {\n gl_FragColor += texture2D(uni[SAMPLE-1], vec2(0));\n}";
/* babel-plugin-inline-import '../../Renderer/Shader/SampleTestVS.glsl' */
const SampleTestVS = "void main() {\n gl_Position = vec4( 0.0, 0.0, 0.0, 1.0 );\n}"; // default values
let logDepthBufferSupported = false;
let maxTexturesUnits = 8;
let maxTextureSize = 4096;
function _WebGLShader(renderer, type, string) {
const gl = renderer.getContext();
const shader = gl.createShader(type);
gl.shaderSource(shader, string);
gl.compileShader(shader);
return shader;
}
export default {
isLogDepthBufferSupported() {
return logDepthBufferSupported;
},
getMaxTextureUnitsCount() {
return maxTexturesUnits;
},
getMaxTextureSize() {
return maxTextureSize;
},
updateCapabilities(renderer) {
const gl = renderer.getContext();
maxTexturesUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
const program = gl.createProgram();
const glVertexShader = _WebGLShader(renderer, gl.VERTEX_SHADER, SampleTestVS);
let fragmentShader = `#define SAMPLE ${maxTexturesUnits}\n`;
fragmentShader += SampleTestFS;
const glFragmentShader = _WebGLShader(renderer, gl.FRAGMENT_SHADER, fragmentShader);
gl.attachShader(program, glVertexShader);
gl.attachShader(program, glFragmentShader);
gl.linkProgram(program);
if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {
// the link operation failed
throw new Error(`The GPU capabilities could not be determined accurately.
Impossible to link a shader with the Maximum texture units ${maxTexturesUnits}`);
}
gl.deleteProgram(program);
gl.deleteShader(glVertexShader);
gl.deleteShader(glFragmentShader);
logDepthBufferSupported = renderer.capabilities.logarithmicDepthBuffer;
}
};