pex-renderer
Version:
Physically Based Renderer for Pex
144 lines (111 loc) • 2.89 kB
JavaScript
const SHADERS = require('../chunks/index.js')
module.exports = /* glsl */ `
// Variables
attribute vec3 aPosition;
attribute vec3 aNormal;
attribute vec2 aTexCoord0;
attribute vec2 aTexCoord1;
attribute vec3 aOffset;
attribute vec3 aScale;
attribute vec4 aRotation;
attribute vec4 aColor;
attribute vec4 aVertexColor;
varying vec4 vColor;
attribute vec4 aJoint;
attribute vec4 aWeight;
uniform mat4 uJointMat[NUM_JOINTS];
uniform sampler2D uDisplacementMap;
uniform float uDisplacement;
uniform mat4 uProjectionMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uModelMatrix;
uniform mat3 uNormalMatrix;
uniform float uPointSize;
float uDisplacementShadowStretch = 1.3;
varying vec3 vNormalView;
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
varying vec3 vPositionView;
// Includes
${SHADERS.math.transposeMat4}
${SHADERS.math.quatToMat4}
void main() {
vec4 position = vec4(aPosition, 1.0);
vec3 normal = vec3(0.0, 0.0, 0.0);
vec2 texCoord = vec2(0.0, 0.0);
vec4 positionView = vec4(0.0);
normal = aNormal;
texCoord = aTexCoord0;
vTexCoord0 = texCoord;
vTexCoord1 = aTexCoord1;
float h = texture2D(uDisplacementMap, aTexCoord0).r;
position.xyz += uDisplacement * h * normal * uDisplacementShadowStretch;
position.xyz *= aScale;
mat4 rotationMat = quatToMat4(aRotation);
position = rotationMat * position;
normal = vec3(rotationMat * vec4(normal, 0.0));
position.xyz += aOffset;
vColor = aVertexColor * aColor;
vColor = aColor;
vColor = aVertexColor;
mat4 skinMat =
aWeight.x * uJointMat[int(aJoint.x)] +
aWeight.y * uJointMat[int(aJoint.y)] +
aWeight.z * uJointMat[int(aJoint.z)] +
aWeight.w * uJointMat[int(aJoint.w)];
positionView = uViewMatrix * skinMat * position;
positionView = uViewMatrix * uModelMatrix * position;
gl_Position = uProjectionMatrix * positionView;
gl_PointSize = uPointSize;
vPositionView = positionView.xyz;
vNormalView = normalize(uNormalMatrix * normal);
}
`