Add more substitutions

This commit is contained in:
schmelczerandras 2020-07-26 19:11:03 +02:00
parent 4369cf1770
commit 79bb7a64a2
6 changed files with 23 additions and 11 deletions

View file

@ -4,10 +4,13 @@ export const createShader = (
source: string, source: string,
substitutions: { [name: string]: string } substitutions: { [name: string]: string }
): WebGLShader => { ): WebGLShader => {
source = source.replace( source = source.replace(/{(.+)}/gm, (_, name: string): string => {
/{(.+)}/gm, const value = substitutions[name];
(_, name: string): string => substitutions[name] if (Number.isInteger(value)) {
); return `${value}.0`;
}
return value;
});
const shader = gl.createShader(type); const shader = gl.createShader(type);
gl.shaderSource(shader, source); gl.shaderSource(shader, source);

View file

@ -13,6 +13,7 @@ export class UniformArrayAutoScalingProgram implements IProgram {
private gl: WebGL2RenderingContext, private gl: WebGL2RenderingContext,
private vertexShaderSource: string, private vertexShaderSource: string,
private fragmentShaderSource: string, private fragmentShaderSource: string,
private substitutions: { [name: string]: any },
private options: { private options: {
getValueFromUniforms: (values: { [name: string]: any }) => number; getValueFromUniforms: (values: { [name: string]: any }) => number;
uniformArraySizeName: string; uniformArraySizeName: string;
@ -63,6 +64,7 @@ export class UniformArrayAutoScalingProgram implements IProgram {
this.fragmentShaderSource, this.fragmentShaderSource,
{ {
[this.options.uniformArraySizeName]: Math.floor(arraySize).toString(), [this.options.uniformArraySizeName]: Math.floor(arraySize).toString(),
...this.substitutions,
} }
); );

View file

@ -91,11 +91,14 @@ export class WebGl2Renderer implements IRenderer {
throw new Error('WebGl2 is not supported'); throw new Error('WebGl2 is not supported');
} }
const distanceScale = 64;
this.distanceFieldFrameBuffer = new IntermediateFrameBuffer(this.gl, [ this.distanceFieldFrameBuffer = new IntermediateFrameBuffer(this.gl, [
new UniformArrayAutoScalingProgram( new UniformArrayAutoScalingProgram(
this.gl, this.gl,
shaderSources[0][0], shaderSources[0][0],
shaderSources[0][1], shaderSources[0][1],
{ distanceScale },
{ {
getValueFromUniforms: (v) => (v.lines ? v.lines.length / 2 : 0), getValueFromUniforms: (v) => (v.lines ? v.lines.length / 2 : 0),
uniformArraySizeName: 'lineCount', uniformArraySizeName: 'lineCount',
@ -111,6 +114,7 @@ export class WebGl2Renderer implements IRenderer {
this.gl, this.gl,
shaderSources[1][0], shaderSources[1][0],
shaderSources[1][1], shaderSources[1][1],
{ distanceScale },
{ {
getValueFromUniforms: (v) => (v.lights ? v.lights.length : 0), getValueFromUniforms: (v) => (v.lights ? v.lights.length : 0),
uniformArraySizeName: 'lightCount', uniformArraySizeName: 'lightCount',

View file

@ -54,6 +54,7 @@ export class Game {
this.objects.addObject(new InfoText()); this.objects.addObject(new InfoText());
createCharacter(this.objects); createCharacter(this.objects);
createDungeon(this.objects); createDungeon(this.objects);
createDungeon(this.objects);
} }
private handleVisibilityChange() { private handleVisibilityChange() {

View file

@ -6,7 +6,8 @@ precision mediump float;
#define LINE_COUNT {lineCount} #define LINE_COUNT {lineCount}
#define CAVE_COLOR vec3(0.36, 0.38, 0.76) #define CAVE_COLOR vec3(0.36, 0.38, 0.76)
#define AIR_COLOR vec3(0.7) #define AIR_COLOR vec3(0.7)
#define DISTANCE_SCALE {distanceScale}
// start, end - start // start, end - start
uniform vec2[LINE_COUNT * 2] lines; uniform vec2[LINE_COUNT * 2] lines;
// startRadius, endRadois // startRadius, endRadois
@ -31,6 +32,6 @@ void main() {
float distance = -minDistance; float distance = -minDistance;
fragmentColor = vec4( fragmentColor = vec4(
mix(CAVE_COLOR, AIR_COLOR, clamp(distance, -10.0, 0.0) / 10.0 + 1.0), mix(CAVE_COLOR, AIR_COLOR, clamp(distance, -10.0, 0.0) / 10.0 + 1.0),
distance / 32.0 distance / DISTANCE_SCALE
); );
} }

View file

@ -3,11 +3,12 @@
precision mediump float; precision mediump float;
#define INFINITY 1000.0 #define INFINITY 1000.0
#define LIGHT_COUNT {lightCount}
#define AMBIENT_LIGHT vec3(0.15) #define AMBIENT_LIGHT vec3(0.15)
#define LIGHT_DROP 400.0 #define LIGHT_DROP 400.0
#define MIN_STEP 3.0 #define MIN_STEP 3.0
#define EDGE_SMOOTHING 5.0 #define EDGE_SMOOTHING 5.0
#define LIGHT_COUNT {lightCount}
#define DISTANCE_SCALE {distanceScale}
uniform struct Light { uniform struct Light {
vec2 center; vec2 center;
@ -23,11 +24,11 @@ in vec2[LIGHT_COUNT] directions;
float getDistance(in vec2 target, out vec3 color) { float getDistance(in vec2 target, out vec3 color) {
vec4 values = texture(distanceTexture, target); vec4 values = texture(distanceTexture, target);
color = values.rgb; color = values.rgb;
return values.w * 32.0; return values.w * DISTANCE_SCALE;
} }
float getDistance(in vec2 target) { float getDistance(in vec2 target) {
return texture(distanceTexture, target).w * 32.0; return texture(distanceTexture, target).w * DISTANCE_SCALE;
} }
float getFractionOfLightArriving( float getFractionOfLightArriving(
@ -43,7 +44,7 @@ float getFractionOfLightArriving(
direction /= viewBoxSize; direction /= viewBoxSize;
for (int j = 0; j < 48; j++) { for (int j = 0; j < 32; j++) {
float minDistance = getDistance(target + direction * rayLength); float minDistance = getDistance(target + direction * rayLength);
movingAverageMeanDistance = movingAverageMeanDistance / 2.0 + minDistance / 2.0; movingAverageMeanDistance = movingAverageMeanDistance / 2.0 + minDistance / 2.0;
q = min(q, movingAverageMeanDistance / rayLength); q = min(q, movingAverageMeanDistance / rayLength);
@ -67,7 +68,7 @@ void main() {
Light light = lights[i]; Light light = lights[i];
float lightDistance = distance(light.center, worldCoordinates); float lightDistance = distance(light.center, worldCoordinates);
float r = lightDistance / LIGHT_DROP + 1.0; float r = (lightDistance + light.radius) / LIGHT_DROP + 1.0;
vec3 lightColorAtPosition = light.value / (r * r); vec3 lightColorAtPosition = light.value / (r * r);
float fractionOfLightArriving = getFractionOfLightArriving( float fractionOfLightArriving = getFractionOfLightArriving(