added objects, textures, and sobel edge detection shader
This commit is contained in:
parent
7f2b135bdd
commit
431877ea09
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
Binary file not shown.
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 625 KiB |
Binary file not shown.
After Width: | Height: | Size: 793 KiB |
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
|
@ -40,6 +40,8 @@ export function changeFragmentShader(gl: any,
|
||||||
shaderProgram, 'uviewMatrix'),
|
shaderProgram, 'uviewMatrix'),
|
||||||
modelMatrix: gl.getUniformLocation(
|
modelMatrix: gl.getUniformLocation(
|
||||||
shaderProgram, 'umodelMatrix'),
|
shaderProgram, 'umodelMatrix'),
|
||||||
|
normalModelMatrix: gl.getUniformLocation(
|
||||||
|
shaderProgram, 'unormalModelMatrix'),
|
||||||
uSampler: gl.getUniformLocation(
|
uSampler: gl.getUniformLocation(
|
||||||
shaderProgram, 'uSampler'),
|
shaderProgram, 'uSampler'),
|
||||||
},
|
},
|
||||||
|
|
|
@ -37,6 +37,7 @@ async function main() {
|
||||||
uniform mat4 uProjectionMatrix;
|
uniform mat4 uProjectionMatrix;
|
||||||
uniform mat4 uviewMatrix;
|
uniform mat4 uviewMatrix;
|
||||||
uniform mat4 umodelMatrix;
|
uniform mat4 umodelMatrix;
|
||||||
|
uniform mat4 unormalModelMatrix;
|
||||||
|
|
||||||
varying highp vec4 vNormal;
|
varying highp vec4 vNormal;
|
||||||
varying highp vec3 vPosition;
|
varying highp vec3 vPosition;
|
||||||
|
@ -46,10 +47,11 @@ async function main() {
|
||||||
{
|
{
|
||||||
gl_Position = uProjectionMatrix *
|
gl_Position = uProjectionMatrix *
|
||||||
uviewMatrix *
|
uviewMatrix *
|
||||||
|
unormalModelMatrix *
|
||||||
umodelMatrix *
|
umodelMatrix *
|
||||||
aVertexPosition;
|
aVertexPosition;
|
||||||
vPosition = vec3(aVertexPosition);
|
vPosition = vec3(aVertexPosition);
|
||||||
vNormal = umodelMatrix * aVertexNormal;
|
vNormal = unormalModelMatrix * aVertexNormal;
|
||||||
vTextureCoord = aTextureCoord;
|
vTextureCoord = aTextureCoord;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
@ -178,6 +180,46 @@ async function main() {
|
||||||
gl_FragColor = vec4((texelColor.xyz * diffuse * 0.8) + (texelColor.xyz * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
gl_FragColor = vec4((texelColor.xyz * diffuse * 0.8) + (texelColor.xyz * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
|
const fsSource5 = `
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
varying highp vec2 vTextureCoord;
|
||||||
|
varying highp vec4 vNormal;
|
||||||
|
varying highp vec3 vPosition;
|
||||||
|
|
||||||
|
uniform sampler2D uSampler;
|
||||||
|
|
||||||
|
void make_kernel(inout vec4 n[9], sampler2D tex, vec2 coord)
|
||||||
|
{
|
||||||
|
float w = 1.0 / 640.;
|
||||||
|
float h = 1.0 / 640.;
|
||||||
|
|
||||||
|
n[0] = texture2D(tex, coord + vec2( -w, -h));
|
||||||
|
n[1] = texture2D(tex, coord + vec2(0.0, -h));
|
||||||
|
n[2] = texture2D(tex, coord + vec2( w, -h));
|
||||||
|
n[3] = texture2D(tex, coord + vec2( -w, 0.0));
|
||||||
|
n[4] = texture2D(tex, coord);
|
||||||
|
n[5] = texture2D(tex, coord + vec2( w, 0.0));
|
||||||
|
n[6] = texture2D(tex, coord + vec2( -w, h));
|
||||||
|
n[7] = texture2D(tex, coord + vec2(0.0, h));
|
||||||
|
n[8] = texture2D(tex, coord + vec2( w, h));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
vec4 n[9];
|
||||||
|
make_kernel( n, uSampler, vTextureCoord);
|
||||||
|
|
||||||
|
vec4 sobel_edge_h = n[2] + (2.0*n[5]) + n[8] - (n[0] + (2.0*n[3]) + n[6]);
|
||||||
|
vec4 sobel_edge_v = n[0] + (2.0*n[1]) + n[2] - (n[6] + (2.0*n[7]) + n[8]);
|
||||||
|
vec4 sobel = sqrt((sobel_edge_h * sobel_edge_h) + (sobel_edge_v * sobel_edge_v));
|
||||||
|
|
||||||
|
if ((1. - sobel.r) + (1. - sobel.g) + (1. - sobel.b) < 2.5)
|
||||||
|
gl_FragColor = vec4(1.0 - sobel.rgb, 1.0 );
|
||||||
|
else
|
||||||
|
gl_FragColor = vec4(vec3(0.), 1.);
|
||||||
|
}`;
|
||||||
|
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -191,7 +233,7 @@ async function main() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await getObj('/static/objs/fox.obj');
|
const data = await getObj('/static/objs/racer.obj');
|
||||||
const params: any = {
|
const params: any = {
|
||||||
distance: $('#distance').val(),
|
distance: $('#distance').val(),
|
||||||
circleSize: $('#circlesize').val(),
|
circleSize: $('#circlesize').val(),
|
||||||
|
@ -201,6 +243,11 @@ async function main() {
|
||||||
y: 0,
|
y: 0,
|
||||||
z: 0,
|
z: 0,
|
||||||
},
|
},
|
||||||
|
rot: {
|
||||||
|
x: $('#rotx').val(),
|
||||||
|
y: $('#roty').val(),
|
||||||
|
z: $('#rotz').val(),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const [
|
const [
|
||||||
|
@ -246,12 +293,14 @@ async function main() {
|
||||||
shaderProgram, 'uviewMatrix'),
|
shaderProgram, 'uviewMatrix'),
|
||||||
modelMatrix: gl.getUniformLocation(
|
modelMatrix: gl.getUniformLocation(
|
||||||
shaderProgram, 'umodelMatrix'),
|
shaderProgram, 'umodelMatrix'),
|
||||||
|
normalModelMatrix: gl.getUniformLocation(
|
||||||
|
shaderProgram, 'unormalModelMatrix'),
|
||||||
uSampler: gl.getUniformLocation(
|
uSampler: gl.getUniformLocation(
|
||||||
shaderProgram, 'uSampler'),
|
shaderProgram, 'uSampler'),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let texture = loadTexture(gl, '/static/textures/fox.png');
|
let texture = loadTexture(gl, '/static/textures/racer.png');
|
||||||
let buffers = initBuffers(gl, positions, indices, normals, uvs);
|
let buffers = initBuffers(gl, positions, indices, normals, uvs);
|
||||||
let then = 0;
|
let then = 0;
|
||||||
let changed = false;
|
let changed = false;
|
||||||
|
@ -317,6 +366,18 @@ async function main() {
|
||||||
const circleSize: any = $('#circlesize').val();
|
const circleSize: any = $('#circlesize').val();
|
||||||
params.circleSize = parseFloat(circleSize);
|
params.circleSize = parseFloat(circleSize);
|
||||||
});
|
});
|
||||||
|
$('#rotx').on('input', function() {
|
||||||
|
const rotx: any = $('#rotx').val();
|
||||||
|
params.rot.x = parseFloat(rotx);
|
||||||
|
});
|
||||||
|
$('#roty').on('input', function() {
|
||||||
|
const roty: any = $('#roty').val();
|
||||||
|
params.rot.y = parseFloat(roty);
|
||||||
|
});
|
||||||
|
$('#rotz').on('input', function() {
|
||||||
|
const rotz: any = $('#rotz').val();
|
||||||
|
params.rot.z = parseFloat(rotz);
|
||||||
|
});
|
||||||
$('#fov').on('input', function() {
|
$('#fov').on('input', function() {
|
||||||
const fov: any = $('#fov').val();
|
const fov: any = $('#fov').val();
|
||||||
params.fov = parseFloat(fov);
|
params.fov = parseFloat(fov);
|
||||||
|
@ -337,6 +398,10 @@ async function main() {
|
||||||
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
||||||
shaderProgram, fragmentShader, fsSource4, vsSource);
|
shaderProgram, fragmentShader, fsSource4, vsSource);
|
||||||
});
|
});
|
||||||
|
$('#s_sobel').on('click', function() {
|
||||||
|
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
||||||
|
shaderProgram, fragmentShader, fsSource5, vsSource);
|
||||||
|
});
|
||||||
$('#o_sphere').on('click', async function() {
|
$('#o_sphere').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/sphere.obj');
|
const data = await getObj('/static/objs/sphere.obj');
|
||||||
updateObj(data);
|
updateObj(data);
|
||||||
|
@ -349,6 +414,14 @@ async function main() {
|
||||||
const data = await getObj('/static/objs/fox.obj');
|
const data = await getObj('/static/objs/fox.obj');
|
||||||
updateObj(data);
|
updateObj(data);
|
||||||
});
|
});
|
||||||
|
$('#o_mecha').on('click', async function() {
|
||||||
|
const data = await getObj('/static/objs/mecha.obj');
|
||||||
|
updateObj(data);
|
||||||
|
});
|
||||||
|
$('#o_racer').on('click', async function() {
|
||||||
|
const data = await getObj('/static/objs/racer.obj');
|
||||||
|
updateObj(data);
|
||||||
|
});
|
||||||
$('#t_wall').on('click', async function() {
|
$('#t_wall').on('click', async function() {
|
||||||
texture = loadTexture(gl, '/static/textures/wall.png');
|
texture = loadTexture(gl, '/static/textures/wall.png');
|
||||||
});
|
});
|
||||||
|
@ -361,6 +434,12 @@ async function main() {
|
||||||
$('#t_fox').on('click', async function() {
|
$('#t_fox').on('click', async function() {
|
||||||
texture = loadTexture(gl, '/static/textures/fox.png');
|
texture = loadTexture(gl, '/static/textures/fox.png');
|
||||||
});
|
});
|
||||||
|
$('#t_racer').on('click', async function() {
|
||||||
|
texture = loadTexture(gl, '/static/textures/racer.png');
|
||||||
|
});
|
||||||
|
$('#t_racer_wireframe').on('click', async function() {
|
||||||
|
texture = loadTexture(gl, '/static/textures/racer_wireframe.png');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
requestAnimationFrame(render);
|
requestAnimationFrame(render);
|
||||||
}
|
}
|
||||||
|
@ -411,28 +490,31 @@ function drawScene(gl: any,
|
||||||
zFar);
|
zFar);
|
||||||
|
|
||||||
|
|
||||||
const modelMatrix = mat4.create();
|
const normalModelMatrix = mat4.create();
|
||||||
|
|
||||||
mat4.rotate(modelMatrix,
|
mat4.rotateX(normalModelMatrix,
|
||||||
|
normalModelMatrix,
|
||||||
|
params.rot.x);
|
||||||
|
mat4.rotateY(normalModelMatrix,
|
||||||
|
normalModelMatrix,
|
||||||
|
params.rot.y);
|
||||||
|
mat4.rotateZ(normalModelMatrix,
|
||||||
|
normalModelMatrix,
|
||||||
|
params.rot.z);
|
||||||
|
|
||||||
|
const modelMatrix = mat4.create();
|
||||||
|
mat4.translate(modelMatrix,
|
||||||
modelMatrix,
|
modelMatrix,
|
||||||
squareRotation,
|
|
||||||
[
|
[
|
||||||
0,
|
-params.avg.x,
|
||||||
1,
|
-params.avg.y,
|
||||||
0,
|
-params.avg.z,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Set the drawing position to the "identity" point, which is
|
// Set the drawing position to the "identity" point, which is
|
||||||
// the center of the scene.
|
// the center of the scene.
|
||||||
const viewMatrix = mat4.create();
|
const viewMatrix = mat4.create();
|
||||||
|
|
||||||
mat4.translate(viewMatrix,
|
|
||||||
viewMatrix,
|
|
||||||
[
|
|
||||||
-params.avg.x,
|
|
||||||
-params.avg.y,
|
|
||||||
-params.avg.z,
|
|
||||||
]);
|
|
||||||
mat4.translate(
|
mat4.translate(
|
||||||
viewMatrix,
|
viewMatrix,
|
||||||
viewMatrix, [
|
viewMatrix, [
|
||||||
|
@ -520,6 +602,10 @@ function drawScene(gl: any,
|
||||||
programInfo.uniformLocations.modelMatrix,
|
programInfo.uniformLocations.modelMatrix,
|
||||||
false,
|
false,
|
||||||
modelMatrix);
|
modelMatrix);
|
||||||
|
gl.uniformMatrix4fv(
|
||||||
|
programInfo.uniformLocations.normalModelMatrix,
|
||||||
|
false,
|
||||||
|
normalModelMatrix);
|
||||||
|
|
||||||
// Tell WebGL we want to affect texture unit 0
|
// Tell WebGL we want to affect texture unit 0
|
||||||
gl.activeTexture(gl.TEXTURE0);
|
gl.activeTexture(gl.TEXTURE0);
|
||||||
|
|
|
@ -19,29 +19,43 @@
|
||||||
<button id='s_color'>Change Shader to colored</button>
|
<button id='s_color'>Change Shader to colored</button>
|
||||||
<button id='s_flat'>Change Shader to flat</button>
|
<button id='s_flat'>Change Shader to flat</button>
|
||||||
<button id='s_texture'>Change Shader to texture</button>
|
<button id='s_texture'>Change Shader to texture</button>
|
||||||
|
<button id='s_sobel'>Change Shader to sobel edge detection</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<div style='display: inline;'>Change distance : </div>
|
<div style='display: inline;'>Change distance : </div>
|
||||||
<input type="range" min="1" max="1000" value="250" class="slider" id="distance">
|
<input type="range" min="1" max="1000" value="30" class="slider" id="distance">
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<div style='display: inline;'>Change circle size : </div>
|
<div style='display: inline;'>Change circle size : </div>
|
||||||
<input type="range" min="1" max="50" value="10" class="slider" id="circlesize">
|
<input type="range" min="0" max="50" value="2" class="slider" id="circlesize">
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<div style='display: inline;'>Change fov : </div>
|
<div style='display: inline;'>Change fov : </div>
|
||||||
<input type="range" min="15" max="150" value="45" class="slider" id="fov">
|
<input type="range" min="15" max="150" value="45" class="slider" id="fov">
|
||||||
</div>
|
</div>
|
||||||
|
<div class='ui-block'>
|
||||||
|
<div style='display: inline;'>Change rotation : </div>
|
||||||
|
<div style='display: inline;'>X: </div>
|
||||||
|
<input type="range" min="0" max="6.2830" value="0.5" step='0.0001' class="slider" id="rotx">
|
||||||
|
<div style='display: inline;'>Y: </div>
|
||||||
|
<input type="range" min="0" max="6.2830" value="0.8" step='0.01' class="slider" id="roty">
|
||||||
|
<div style='display: inline;'>Z: </div>
|
||||||
|
<input type="range" min="0" max="6.2830" value="1" step='0.01' class="slider" id="rotz">
|
||||||
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<button id='o_sphere'>Set object to sphere</button>
|
<button id='o_sphere'>Set object to sphere</button>
|
||||||
<button id='o_teapot'>Set object to teapot</button>
|
<button id='o_teapot'>Set object to teapot</button>
|
||||||
<button id='o_fox'>Set object to fox</button>
|
<button id='o_fox'>Set object to fox</button>
|
||||||
|
<button id='o_mecha'>Set object to mecha</button>
|
||||||
|
<button id='o_racer'>Set object to racer</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<button id='t_wall'>Set texture to wall</button>
|
<button id='t_wall'>Set texture to wall</button>
|
||||||
<button id='t_ice'>Set texture to ice</button>
|
<button id='t_ice'>Set texture to ice</button>
|
||||||
<button id='t_noise'>Set texture to noise</button>
|
<button id='t_noise'>Set texture to noise</button>
|
||||||
<button id='t_fox'>Set texture to fox</button>
|
<button id='t_fox'>Set texture to fox</button>
|
||||||
|
<button id='t_racer'>Set texture to racer</button>
|
||||||
|
<button id='t_racer_wireframe'>Set texture to racer wireframe</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<p>If you're on mobile, you need to set the shader to texture to change object, then you can change the shader</p>
|
<p>If you're on mobile, you need to set the shader to texture to change object, then you can change the shader</p>
|
||||||
|
|
Loading…
Reference in New Issue