|
19 | 19 | return (source || '').replace(new RegExp(`#line\\s+(\\d+)\\s+${SELF_SOURCE_ID}`, 'g'), '#line $1 0'); |
20 | 20 | }; |
21 | 21 |
|
| 22 | + root.shaderCompile.prepareFragmentShader = function (source, glslUseVersion3) { |
| 23 | + if (glslUseVersion3) { |
| 24 | + return ( |
| 25 | + '#ifdef gl_FragColor\n' + |
| 26 | + '#define GLSL_FRAGCOLOR gl_FragColor\n' + |
| 27 | + '#else\n' + |
| 28 | + 'layout(location = 0) out highp vec4 layoutFragColor;\n' + |
| 29 | + '#define gl_FragColor layoutFragColor\n' + |
| 30 | + '#define GLSL_FRAGCOLOR layoutFragColor\n' + |
| 31 | + '#endif\n' + |
| 32 | + '#define texture2D texture\n' + |
| 33 | + '#define textureCube texture\n' + |
| 34 | + '\n' + (source || '') |
| 35 | + ); |
| 36 | + } |
| 37 | + return ( |
| 38 | + '#define GLSL_FRAGCOLOR gl_FragColor\n' + |
| 39 | + '\n' + (source || '') |
| 40 | + ); |
| 41 | + }; |
| 42 | + |
| 43 | + root.shaderCompile.prepareVertexShader = function (source, glslUseVersion3) { |
| 44 | + if (!glslUseVersion3) { |
| 45 | + throw new Error('Custom vertex shaders (#iVertex) require shader-toy.webglVersion = "WebGL2".'); |
| 46 | + } |
| 47 | + |
| 48 | + return ( |
| 49 | + '#define texture2D texture\n' + |
| 50 | + '#define textureCube texture\n' + |
| 51 | + '\n' + (source || '') |
| 52 | + ); |
| 53 | + }; |
| 54 | + |
| 55 | + const getCompileHeader = (glslUseVersion3) => { |
| 56 | + // Keep header line count stable (2 lines) for easier line-offset mapping. |
| 57 | + return glslUseVersion3 |
| 58 | + ? '#version 300 es\nprecision highp float;\n' |
| 59 | + : '// shader-toy\nprecision highp float;\n'; |
| 60 | + }; |
| 61 | + |
22 | 62 | root.shaderCompile.compileFragShader = function (gl, fsSource) { |
23 | 63 | const fs = gl.createShader(gl.FRAGMENT_SHADER); |
24 | 64 | const normalized = root.shaderCompile.normalizeLineDirectives(fsSource); |
|
31 | 71 | } |
32 | 72 | return true; |
33 | 73 | }; |
| 74 | + |
| 75 | + root.shaderCompile.compileIncludeFragment = function (gl, fsSource, glslUseVersion3) { |
| 76 | + const fs = gl.createShader(gl.FRAGMENT_SHADER); |
| 77 | + const normalized = root.shaderCompile.normalizeLineDirectives(fsSource); |
| 78 | + const header = getCompileHeader(glslUseVersion3); |
| 79 | + const wrapped = `${header}${normalized || ''}\nvoid main() {}\n`; |
| 80 | + gl.shaderSource(fs, wrapped); |
| 81 | + gl.compileShader(fs); |
| 82 | + if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS)) { |
| 83 | + const fragmentLog = gl.getShaderInfoLog(fs); |
| 84 | + console.error('THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.COMPILE_STATUS', null, null, null, null, fragmentLog); |
| 85 | + return false; |
| 86 | + } |
| 87 | + return true; |
| 88 | + }; |
| 89 | + |
| 90 | + root.shaderCompile.compileVertexShader = function (gl, vsSource, glslUseVersion3) { |
| 91 | + const vs = gl.createShader(gl.VERTEX_SHADER); |
| 92 | + const normalized = root.shaderCompile.normalizeLineDirectives(vsSource); |
| 93 | + const header = getCompileHeader(glslUseVersion3); |
| 94 | + const wrapped = `${header}${normalized || ''}`; |
| 95 | + gl.shaderSource(vs, wrapped); |
| 96 | + gl.compileShader(vs); |
| 97 | + if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS)) { |
| 98 | + const vertexLog = gl.getShaderInfoLog(vs); |
| 99 | + console.error('THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.COMPILE_STATUS', null, null, null, null, vertexLog); |
| 100 | + return false; |
| 101 | + } |
| 102 | + return true; |
| 103 | + }; |
34 | 104 | })(typeof window !== 'undefined' ? window : globalThis); |
0 commit comments