Skip to content

Commit 9a394d6

Browse files
authored
Merge pull request #7 from kenrussell/reflection-shader
Added reflection shader, deriving math from first principles.
2 parents ead9678 + 69b99cf commit 9a394d6

File tree

2 files changed

+58
-13
lines changed

2 files changed

+58
-13
lines changed

hdr/hdr.html

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@
190190
}
191191
</script>
192192

193+
<!----- Reflection shader ----->
194+
195+
<script id="reflectionVertexShader" type="text/something-not-javascript">
196+
attribute vec3 position;
197+
attribute vec3 normal;
198+
199+
uniform mat4 u_world;
200+
uniform mat4 u_view;
201+
uniform mat4 u_worldViewProjection;
202+
203+
varying vec3 v_normal;
204+
varying vec3 v_worldEyeVec;
205+
206+
void main(void) {
207+
v_normal = (u_world * vec4(normalize(normal), 0.0)).xyz;
208+
vec4 worldPosition = u_worldViewProjection * vec4(position, 1.0);
209+
vec3 worldEyePos = u_view[3].xyz;
210+
gl_Position = worldPosition;
211+
v_worldEyeVec = normalize(worldPosition.xyz - worldEyePos);
212+
}
213+
</script>
214+
215+
<script id="reflectionFragmentShader" type="text/something-not-javascript">
216+
precision mediump float;
217+
218+
varying vec3 v_normal;
219+
varying vec3 v_worldEyeVec;
220+
uniform vec3 u_diffuseColor;
221+
uniform float u_shininess;
222+
uniform samplerCube u_irradianceMap;
223+
uniform samplerCube u_reflectionMap;
224+
void main(void) {
225+
vec3 normal = normalize(v_normal);
226+
vec4 irradiance = textureCube(u_irradianceMap, normal);
227+
vec4 reflection = textureCube(u_reflectionMap, reflect(v_worldEyeVec, normal));
228+
gl_FragColor = vec4(u_diffuseColor, 1.0) + (1.0 - u_shininess) * irradiance + u_shininess * reflection;
229+
}
230+
</script>
231+
193232
<!----- HDRPipeline vertex shader ----->
194233

195234
<script id="hdrPipelineVertexShader" type="text/something-not-javascript">

hdr/hdr.js

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ var exposure = 1.0;
3232
var kMaxLocalSigma = 4.0;
3333
var kMaxKernelWidth = 25;
3434

35+
var irradianceMap;
36+
var reflectionMap;
37+
3538
function makeInt(value) {
3639
return value | 0;
3740
}
@@ -251,13 +254,6 @@ HDRCubeMap.prototype.update_ = function() {
251254
* Sets up the Skybox
252255
*/
253256
function setupSkybox() {
254-
var reflectionMap = new HDRCubeMap(
255-
["assets/grace_cross_mmp-posx.bin",
256-
"assets/grace_cross_mmp-negx.bin",
257-
"assets/grace_cross_mmp-posy.bin",
258-
"assets/grace_cross_mmp-negy.bin",
259-
"assets/grace_cross_mmp-posz.bin",
260-
"assets/grace_cross_mmp-negz.bin"]);
261257
var textures = {
262258
u_skybox: reflectionMap
263259
};
@@ -875,7 +871,6 @@ var HDRDemo = function() {
875871
var view = new Float32Array(16);
876872
var world = new Float32Array(16);
877873

878-
var worldView = new Float32Array(16);
879874
var viewProjection = new Float32Array(16);
880875
var viewDirectionProjectionInverse = new Float32Array(16);
881876
var worldViewProjection = new Float32Array(16);
@@ -885,11 +880,19 @@ var HDRDemo = function() {
885880
this.models = [];
886881

887882
// this.program = createProgramFromTags("diffuseVertexShader", "diffuseFragmentShader");
888-
this.program = createProgramFromTags("irradianceVertexShader", "irradianceFragmentShader");
883+
// this.program = createProgramFromTags("irradianceVertexShader", "irradianceFragmentShader");
884+
this.program = createProgramFromTags("reflectionVertexShader", "reflectionFragmentShader");
889885

890886
this.load("assets/teapot-12kverts/scene.js");
891887

892-
var irradianceMap = new HDRCubeMap(
888+
reflectionMap = new HDRCubeMap(
889+
["assets/grace_cross_mmp-posx.bin",
890+
"assets/grace_cross_mmp-negx.bin",
891+
"assets/grace_cross_mmp-posy.bin",
892+
"assets/grace_cross_mmp-negy.bin",
893+
"assets/grace_cross_mmp-posz.bin",
894+
"assets/grace_cross_mmp-negz.bin"]);
895+
irradianceMap = new HDRCubeMap(
893896
["assets/grace_cross_irrad_mmp-posx.bin",
894897
"assets/grace_cross_irrad_mmp-negx.bin",
895898
"assets/grace_cross_irrad_mmp-posy.bin",
@@ -965,7 +968,7 @@ var HDRDemo = function() {
965968
m4.setTranslation(m4t0, [0, 0, 0]);
966969
m4.mul(m4t1, m4t0, projection);
967970
m4.inverse(viewDirectionProjectionInverse, m4t1);
968-
971+
969972
gl.depthMask(false);
970973

971974
// Draw the skybox.
@@ -980,16 +983,19 @@ var HDRDemo = function() {
980983

981984
var uniformsConst = {
982985
u_worldViewProjection: worldViewProjection,
983-
u_worldView: worldView,
986+
u_view: view,
984987
u_world: world,
985988
// u_lightDir: [-1.0, 1.0, 1.0],
986989
// u_lightColor: [0.8, 0.7, 0.6, 1.0],
990+
u_diffuseColor: [ 0.0, 0.0, 0.0 ],
991+
u_shininess: 0.95,
987992
u_irradianceMap: irradianceMap,
993+
u_reflectionMap: reflectionMap,
988994
};
989995
var uniformsPer = {};
990996

991997
for (var ii = 0; ii < this.models.length; ++ii) {
992-
var model = this.models[0];
998+
var model = this.models[ii];
993999
model.drawPrep(uniformsConst);
9941000
model.draw(uniformsPer);
9951001
}

0 commit comments

Comments
 (0)