@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
190 lines (163 loc) • 5.72 kB
JavaScript
import { SEMANTIC_POSITION, SEMANTIC_BLENDWEIGHT, SEMANTIC_BLENDINDICES, SEMANTIC_COLOR, SEMANTIC_TEXCOORD0 } from '../../../platform/graphics/constants.js';
import { ShaderUtils } from '../../../platform/graphics/shader-utils.js';
import { shaderChunks } from '../chunks/chunks.js';
import { ShaderPass } from '../../shader-pass.js';
import { ShaderGenerator } from './shader-generator.js';
const vShader = `
attribute vec4 vertex_color;
varying vec4 vColor;
attribute vec2 vertex_texCoord0;
varying vec2 vUv0;
varying float vDepth;
uniform mat4 matrix_view;
uniform vec4 camera_params;
void main(void) {
gl_Position = getPosition();
vDepth = -(matrix_view * vec4(getWorldPosition(),1.0)).z * camera_params.x;
vColor = vertex_color;
vUv0 = vertex_texCoord0;
}
`;
const fShader = `
varying vec4 vColor;
uniform vec4 uColor;
varying vec2 vUv0;
uniform sampler2D texture_diffuseMap;
varying float vDepth;
void main(void) {
gl_FragColor = vColor;
gl_FragColor = uColor;
gl_FragColor *= texture2D(texture_diffuseMap, vUv0);
alphaTest(gl_FragColor.a);
gl_FragColor = packFloat(vDepth);
glFragColor.rgb = addFog(gl_FragColor.rgb);
}
`;
class ShaderGeneratorBasic extends ShaderGenerator {
generateKey(options) {
let key = 'basic';
if (options.fog) key += '_fog';
if (options.alphaTest) key += '_atst';
if (options.vertexColors) key += '_vcol';
if (options.diffuseMap) key += '_diff';
if (options.skin) key += '_skin';
if (options.screenSpace) key += '_ss';
if (options.useInstancing) key += '_inst';
if (options.useMorphPosition) key += '_morphp';
if (options.useMorphNormal) key += '_morphn';
if (options.useMorphTextureBased) key += '_morpht';
key += `_${options.pass}`;
return key;
}
createAttributesDefinition(definitionOptions, options) {
// GENERATE ATTRIBUTES
const attributes = {
vertex_position: SEMANTIC_POSITION
};
if (options.skin) {
attributes.vertex_boneWeights = SEMANTIC_BLENDWEIGHT;
attributes.vertex_boneIndices = SEMANTIC_BLENDINDICES;
}
if (options.vertexColors) {
attributes.vertex_color = SEMANTIC_COLOR;
}
if (options.diffuseMap) {
attributes.vertex_texCoord0 = SEMANTIC_TEXCOORD0;
}
definitionOptions.attributes = attributes;
}
createVertexDefinition(device, definitionOptions, options, shaderPassInfo) {
const includes = new Map();
const defines = new Map();
includes.set('shaderPassDefines', shaderPassInfo.shaderDefines);
includes.set('transformDeclVS', shaderChunks.transformDeclVS);
includes.set('transformVS', shaderChunks.transformVS);
includes.set('skinCode', ShaderGenerator.skinCode(device));
if (options.skin) defines.set('SKIN', true);
if (options.vertexColors) defines.set('VERTEX_COLORS', true);
if (options.diffuseMap) defines.set('DIFFUSE_MAP', true);
definitionOptions.vertexCode = vShader;
definitionOptions.vertexIncludes = includes;
definitionOptions.vertexDefines = defines;
}
createFragmentDefinition(definitionOptions, options, shaderPassInfo) {
const includes = new Map();
const defines = new Map();
includes.set('shaderPassDefines', shaderPassInfo.shaderDefines);
includes.set('fogCode', ShaderGenerator.fogCode(options.fog));
includes.set('alphaTestPS', shaderChunks.alphaTestPS);
includes.set('packDepthPS', shaderChunks.packDepthPS);
if (options.vertexColors) defines.set('VERTEX_COLORS', true);
if (options.diffuseMap) defines.set('DIFFUSE_MAP', true);
if (options.fog) defines.set('FOG', true);
if (options.alphaTest) defines.set('ALPHA_TEST', true);
definitionOptions.fragmentCode = fShader;
definitionOptions.fragmentIncludes = includes;
definitionOptions.fragmentDefines = defines;
}
createShaderDefinition(device, options) {
const definitionOptions = {
name: 'BasicShader'
};
const shaderPassInfo = ShaderPass.get(device).getByIndex(options.pass);
this.createAttributesDefinition(definitionOptions, options);
this.createVertexDefinition(device, definitionOptions, options, shaderPassInfo);
this.createFragmentDefinition(definitionOptions, options, shaderPassInfo);
return ShaderUtils.createDefinition(device, definitionOptions);
}
}
const basic = new ShaderGeneratorBasic();
export { basic };