|
@@ -14,39 +14,50 @@ export type DefineValues = { [k: string]: ValueCell<DefineType> }
|
|
|
|
|
|
const shaderCodeId = idFactory()
|
|
|
|
|
|
+export interface ShaderExtensions {
|
|
|
+ readonly standardDerivatives: boolean
|
|
|
+ readonly fragDepth: boolean
|
|
|
+}
|
|
|
+
|
|
|
export interface ShaderCode {
|
|
|
- id: number
|
|
|
- vert: string
|
|
|
- frag: string
|
|
|
+ readonly id: number
|
|
|
+ readonly vert: string
|
|
|
+ readonly frag: string
|
|
|
+ readonly extensions: ShaderExtensions
|
|
|
}
|
|
|
|
|
|
-export function ShaderCode(vert: string, frag: string): ShaderCode {
|
|
|
- return { id: shaderCodeId(), vert, frag }
|
|
|
+export function ShaderCode(vert: string, frag: string, extensions: ShaderExtensions): ShaderCode {
|
|
|
+ return { id: shaderCodeId(), vert, frag, extensions }
|
|
|
}
|
|
|
|
|
|
export const PointsShaderCode = ShaderCode(
|
|
|
require('mol-gl/shader/points.vert'),
|
|
|
- require('mol-gl/shader/points.frag')
|
|
|
+ require('mol-gl/shader/points.frag'),
|
|
|
+ { standardDerivatives: false, fragDepth: false }
|
|
|
)
|
|
|
|
|
|
export const LinesShaderCode = ShaderCode(
|
|
|
require('mol-gl/shader/lines.vert'),
|
|
|
- require('mol-gl/shader/lines.frag')
|
|
|
+ require('mol-gl/shader/lines.frag'),
|
|
|
+ { standardDerivatives: false, fragDepth: false }
|
|
|
)
|
|
|
|
|
|
export const MeshShaderCode = ShaderCode(
|
|
|
require('mol-gl/shader/mesh.vert'),
|
|
|
- require('mol-gl/shader/mesh.frag')
|
|
|
+ require('mol-gl/shader/mesh.frag'),
|
|
|
+ { standardDerivatives: true, fragDepth: false }
|
|
|
)
|
|
|
|
|
|
export const GaussianDensityShaderCode = ShaderCode(
|
|
|
require('mol-gl/shader/gaussian-density.vert'),
|
|
|
- require('mol-gl/shader/gaussian-density.frag')
|
|
|
+ require('mol-gl/shader/gaussian-density.frag'),
|
|
|
+ { standardDerivatives: false, fragDepth: false }
|
|
|
)
|
|
|
|
|
|
export const DirectVolumeShaderCode = ShaderCode(
|
|
|
require('mol-gl/shader/direct-volume.vert'),
|
|
|
- require('mol-gl/shader/direct-volume.frag')
|
|
|
+ require('mol-gl/shader/direct-volume.frag'),
|
|
|
+ { standardDerivatives: false, fragDepth: true }
|
|
|
)
|
|
|
|
|
|
export type ShaderDefines = {
|
|
@@ -74,8 +85,20 @@ function getDefinesCode (defines: ShaderDefines) {
|
|
|
return lines.join('\n') + '\n'
|
|
|
}
|
|
|
|
|
|
-const glsl100FragPrefix = `#extension GL_OES_standard_derivatives : enable
|
|
|
-`
|
|
|
+function getGlsl100FragPrefix(ctx: Context, extensions: ShaderExtensions) {
|
|
|
+ const prefix: string[] = []
|
|
|
+ if (extensions.standardDerivatives) {
|
|
|
+ prefix.push('#extension GL_OES_standard_derivatives : enable')
|
|
|
+ prefix.push('#define enabledStandardDerivatives')
|
|
|
+ }
|
|
|
+ if (extensions.fragDepth) {
|
|
|
+ if (ctx.extensions.fragDepth) {
|
|
|
+ prefix.push('#extension GL_EXT_frag_depth : enable')
|
|
|
+ prefix.push('#define enabledFragDepth')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return prefix.join('\n') + '\n'
|
|
|
+}
|
|
|
|
|
|
const glsl300VertPrefix = `#version 300 es
|
|
|
#define attribute in
|
|
@@ -89,16 +112,20 @@ layout(location = 0) out highp vec4 out_FragColor;
|
|
|
#define gl_FragColor out_FragColor
|
|
|
#define gl_FragDepthEXT gl_FragDepth
|
|
|
#define texture2D texture
|
|
|
+
|
|
|
+#define enabledStandardDerivatives
|
|
|
+#define enabledFragDepth
|
|
|
`
|
|
|
|
|
|
export function addShaderDefines(ctx: Context, defines: ShaderDefines, shaders: ShaderCode): ShaderCode {
|
|
|
const { isWebGL2 } = ctx
|
|
|
const header = getDefinesCode(defines)
|
|
|
const vertPrefix = isWebGL2 ? glsl300VertPrefix : ''
|
|
|
- const fragPrefix = isWebGL2 ? glsl300FragPrefix : glsl100FragPrefix
|
|
|
+ const fragPrefix = isWebGL2 ? glsl300FragPrefix : getGlsl100FragPrefix(ctx, shaders.extensions)
|
|
|
return {
|
|
|
id: shaderCodeId(),
|
|
|
vert: `${vertPrefix}${header}${shaders.vert}`,
|
|
|
- frag: `${fragPrefix}${header}${shaders.frag}`
|
|
|
+ frag: `${fragPrefix}${header}${shaders.frag}`,
|
|
|
+ extensions: shaders.extensions
|
|
|
}
|
|
|
}
|