pex-renderer
Version:
Physically Based Renderer for Pex
170 lines (130 loc) • 3.47 kB
JavaScript
const SHADERS = require('../chunks/index.js')
module.exports = /* glsl */ `
// Variables
attribute vec3 aPosition;
attribute vec3 aNormal;
attribute vec4 aTangent;
varying vec4 vTangentView;
attribute vec2 aTexCoord0;
attribute vec2 aTexCoord1;
attribute vec3 aOffset;
attribute vec3 aScale;
attribute vec4 aRotation;
attribute vec4 aColor;
attribute vec4 aVertexColor;
varying vec4 vColor;
uniform sampler2D uDisplacementMap;
uniform mediump float uDisplacement;
attribute vec4 aJoint;
attribute vec4 aWeight;
uniform mat4 uJointMat[NUM_JOINTS];
uniform mat4 uProjectionMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uModelMatrix;
uniform mat3 uNormalMatrix;
uniform mat4 uInverseViewMatrix;
uniform float uPointSize;
varying vec3 vNormalWorld;
varying vec3 vNormalView;
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
varying vec3 vPositionWorld;
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);
normal = aNormal;
vec4 tangent = aTangent;
texCoord = aTexCoord0;
vTexCoord0 = texCoord;
vTexCoord1 = aTexCoord1;
float h = texture2D(uDisplacementMap, aTexCoord0).r;
position.xyz += uDisplacement * h * normal;
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;
vPositionWorld = vec3(uModelMatrix * position);
vPositionView = vec3(uViewMatrix * vec4(vPositionWorld, 1.0));
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)];
vNormalView = vec3(uViewMatrix * skinMat * vec4(normal, 0.0));
vTangentView.xyz = vec4(uViewMatrix * skinMat * vec4(tangent, 0.0));
vTangentView.w = tangent.w;
vNormalWorld = normalize(vec3(uInverseViewMatrix * vec4(vNormalView, 0.0)));
gl_Position = uProjectionMatrix * uViewMatrix * skinMat * position;
vNormalView = vec3(uNormalMatrix * normal);
vTangentView.xyz = vec3(uNormalMatrix * tangent.xyz);
vTangentView.w = tangent.w;
vNormalWorld = normalize(vec3(uInverseViewMatrix * vec4(vNormalView, 0.0)));
gl_Position = uProjectionMatrix * vec4(vPositionView, 1.0);
gl_PointSize = uPointSize;
}
`