Bar spotlights are an ideal choice to brighten a larger space as they feature multiple adjustable lights for greater coverage. With track ...

Contrast lightmeaning

Color dissonance can be loosely described as a color scheme that uses complementary colors, which are ones that are opposite of each other on the color wheel. In Figures 1 through 3 you can see the color wheel used for light (Additive Color Model). With this model, the primary colors are red, green and blue (RGB—sound familiar?); the respective secondary colors are cyan, magenta and yellow.

Figure 10. Creating color harmony. Grafton Ghost Town, Utah. Nikon D700 with a Nikon 24mm f/2.8 lens, light painted with a Coast HP5R flashlight. 1 minute, f/9, ISO 200.

Too much light makes it difficult to work well and too little light has the same effect. Workplace lighting has to strike a balance between visual comfort ...

Color is an important feature in all of our imagery, day or night. While we don’t always have control over the color in a scene, given the opportunity, we should influence it to the best of our ability.

There’s been barrels of ink written about how we respond emotionally to color, especially when it comes to marketing. We see orange as cheerful, red as exciting, green as peaceful and blue as trustworthy. While there may be grains of truth in this, our personal experiences, not to mention the context the color is being used, render these classifications as no more than points of interest when it comes to photography.

Now, in our Thirteenth year, Illumination has offered unique, high-quality, affordable images for thousands of Louisville area high school seniors. Our ...

Other situations, however, may provide us with more power to control the overall effect of color—in particular, when we are adding our own light to the scene.

Visualcontrastexamples

Show your support for National Parks at Night’s workshop programs: If you purchase gear via many of links in our blog posts, our program receives a small percentage of the sales. Thank you!

See the example. In this case the light source is assumed to be at the point of view, because the view space direction to the light (L) is vec3(0.0, 0.0, 1.0):

Compare Figures 7 and 8. In Figure 7 we are seeing color contrast (dissonance), and in Figure 8, color harmony. While looking at each, notice how your eye moves. The movement is more abrupt with color contrast and a bit less when there’s color harmony.

Consider how you want your viewer to see the image. Should their eyes bounce back and forth between illuminated subjects (dissonance) or should they move gently through the image (harmony)?

Advanced Light Microscopy Facility. This facility offers a collection of state-of-the-art light microscopy equipment and image processing tools. ... The ALMF ...

If you do not have normal vectors, then the surface normal vector can be calculated approximately by the partial derivative of the view space position in the fragment shader. The partial derivative can be get by the functions dFdx and dFdy.

24K subscribers in the led community. Ask questions and share information about using LED lights in your home, your projects, your car, ...

Figure 6. Cooler colors found in the absence of artificial light. Glacier National Park. Nikon D4s with a Nikon 14-24mm f/2.8 lens. 30 seconds, f/9, ISO 3200.

We’d love to see what you do! Post your images in the comments, share on our Facebook page, or tag us (@nationalparksatnight) on Instagram.

For the image in Figure 10, I went for the complete opposite: color unity. I made this at Grafton Ghost town during our Zion National Park workshop in 2016. I wanted to create a cool color harmony that would provoke a somewhat spooky feeling.

Figure 7. Cool night sky with warm artificial lights. San Francisco. Canon EOS-1Ds with a Sigma 70-200mm f/2.8 lens. 20 seconds, f/16, ISO 100.

The landscape was being illuminated by a full moon. I set my white balance to 4000 K. Images made under a full moon can often look like they were shot in daylight, so lowering the white balance to 4000 K helps keep the impression of a night scene.

Contrast lightindoor

What I do believe is important for the photographer, however, is color dissonance and color harmony. These terms describe the effect of pairs or groupings of color.

Now I want to add a second mode, where the wireframes are shown as (semi)solid models. For this, I need some lighting. Lighting should be quite easy, just some global directional light with fixed colour and direction.

White balance influences the overall color cast. This means it will affect all colors equally. Set the white balance to anchor the color of your ambient light (sky, fog, moonlight, etc.). This step should be done first, as it sets the stage for any color you may add into the scene.

With this normal vector you can calculate a diffuse light with very low quality. The surfaces appears to be flat and the light seems to be calculated by face normal vectors rather than smooth vertex normal vectors. But it is possible to implement a basic light model and can be improved, by using "real" normal vectors later.

A setting of 4000 K renders my Coast HP5R only somewhat blue, and again I wanted more blue, to match the coolness of the ambient light. So I added a light blue gel to the front of the flashlight to increase the depth of blue, which helped retain color harmony throughout the image.

Highcontrast light

Figure 8. Influencing the scene toward color harmony. Nelson Ghost Town, Nevada. Nikon D4 with a Nikon 35mm f/2 lens, light painted with a Coast HP5R flashlight. 4 minutes, f/9, ISO 100.

Image

ContrastLighting rep

Contrast lightoutdoor

We use it to help fit our mood, or even to enhance it. It may determine the car we drive off the lot or the image of ourselves we want to project. With this level of integration with our daily lives, it’s amazing we don’t give color a higher priority in our image-making processes. We tend to think the color that’s present (in the words of the kids these days) is what is.

The display backlight is the single largest power consumer in a typical portable apparatus, accounting for almost 50% of battery drain with the display at ...

Figure 7 demonstrates the familiar contrast between the cool night sky and the warmth of artificial lights, and is a perfect example of how we don’t always have the ability to control the color contrast in the scene. If I had changed the white balance to try to change one color cast, that would have affected the other color cast too. In a scene like this, we are stuck with the naturally occurring color contrast.

Advanced Interconnections designs and manufactures customized interconnect solutions, specializing in IC sockets, package conversion adapters, and board to ...

You’ll hear that warm colors such as yellow, orange and red are more active, more exciting—and that cooler colors such purple, blue and green are somewhat calming, less active. I believe there is something to that. However, night photographers rarely think of changing the entire color cast of an image to project a feeling. What’s more likely is that we’ll find ourselves in either a warm-color or cool-color situation in the field. For example, we may be shooting in the warmer light of a city (Figure 5), or in the cooler conditions of a wilderness landscape where light pollution is not present (Figure 6).

Then I added in my light painting. With the camera’s white balance set to Direct Sun, I knew my Coast HP7R would render as neutral, tending toward blue. But I wanted more color dissonance—more action, more excitement created by color contrast. So I put a pale blue gel over the flashlight to push the color further toward blue.

For example, blue may project “trustworthiness” in a logo, but that’s not the word that comes to mind when viewing a night sky. The green of the forest can be perceived as relaxing, but may not have the same effect when projected onto a night scene with a flashlight.

What has to be added here to let my geometry be lit by a global directional light (but not by some additional point light sources)?

The trick is to decide where you want the viewer to focus. If the colors are really punchy, the viewer may pay more attention to the difference in color. If the colors are similar to one another, the imaginary line drawn between the colors may be less apparent. There is no right or wrong. It’s just a matter of how you want people to move through your photograph and where you want their focus to be. That decision can be directed by your personal style, or by the subject matter.

Feb 24, 2023 — Cultivators must account for variables like defoliation, environmental parameters, and feed when they install high-intensity LED lighting fixtures.

Contrastlighting photography

While I think color psychology is interesting, I believe its connection to photography is minimal. When you take a picture of an orange, your viewer is more likely to think of a citrus slice or juice rather than an active emotional state.

So when you consider the possible changes you can make to color in a scene, consider dissonance versus harmony. Simply put, do you want to create an image that’s visually active and has punch (more color contrast—dissonance) or an image that is tranquil (less contrast—color harmony)?

It’s within these common situations that we can begin to consider color, and to perhaps even create a color strategy. Sometimes we can affect the overall color dissonance or harmony, sometimes we can’t, but it’s good to know the effects of both approaches so that we can use them creatively when possible.

When using complementary colors together, you are creating a color scheme that is punchy. It decreases color unity and increases color contrast.

The result? A blue spotlight creating a star through the orange fog that highlights a silhouette. Color contrast. Color dissonance.

Currently, my OpenGL scene does not make use of any lights, it uses only wireframes which have a fixed colour - which works fine for me.

Color harmony can be loosely described as a color scheme that uses analogous colors. These are colors that are near to each other on the color wheel. Figure 4 shows the analogous colors of yellow, orange and red.

All night photography provided by and © Gabriel Biderman, Tim Cooper, Matt Hill, Lance Keimig and Chris Nicholson.National Parks at Night is an authorized permittee of the National Park Service.

The next time you’re light painting, keep in mind the concepts of color contrast and color harmony. Then experiment with each to create different images with different kinds of impact. This exercise will create an expertise in applying these concepts to great affect, guaranteeing that you’ll level up your night photography.

Contrast lightceiling

Image

See the example which demonstrates the light model. Of course the example is implemented in WebGL and not OpenGL, but the fragment shader is very similar:

Image

Figure 9. Creating color contrast. San Francisco. Nikon Z 6 with a Nikon Z 24-70mm f/4 lens, light painted with a Coast HP7R flashlight. 15 seconds, f/4, ISO 800.

At least that’s what I thought after I learned about color. For the first several years of my photography career I was regrettably ignorant to the importance and impact of the colors we use in our images. I’ve come to find out this is not at all uncommon. Many photographers who produce color images are as equally unaware of color’s characteristics.

(function loadscene() { var gl, progDraw, vp_size; var bufCube = {}; function render(delteMS){ Camera.create(); Camera.vp = vp_size; gl.viewport( 0, 0, vp_size[0], vp_size[1] ); gl.enable( gl.DEPTH_TEST ); gl.clearColor( 0.0, 0.0, 0.0, 1.0 ); gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT ); // set up draw shader ShProg.Use( progDraw ); ShProg.SetM44( progDraw, "u_projectionMat44", Camera.Perspective() ); ShProg.SetM44( progDraw, "u_viewMat44", Camera.LookAt() ); var modelMat = IdentM44() modelMat = RotateAxis( modelMat, CalcAng( delteMS, 13.0 ), 0 ); modelMat = RotateAxis( modelMat, CalcAng( delteMS, 17.0 ), 1 ); ShProg.SetM44( progDraw, "u_modelMat44", modelMat ); ShProg.SetF3( progDraw, "color", [0.9, 0.9, 0.5] ); // draw scene VertexBuffer.Draw( bufCube ); requestAnimationFrame(render); } function resize() { //vp_size = [gl.drawingBufferWidth, gl.drawingBufferHeight]; vp_size = [window.innerWidth, window.innerHeight] canvas.width = vp_size[0]; canvas.height = vp_size[1]; } function initScene() { canvas = document.getElementById( "canvas"); gl = canvas.getContext( "experimental-webgl" ); if ( !gl ) return null; var ext_standard_derivatives = gl.getExtension( "OES_standard_derivatives" ); // dFdx, dFdy if (!ext_standard_derivatives) alert('no standard derivatives support (no dFdx, dFdy)'); progDraw = ShProg.Create( [ { source : "draw-shader-vs", stage : gl.VERTEX_SHADER }, { source : "draw-shader-fs", stage : gl.FRAGMENT_SHADER } ] ); if ( !progDraw.progObj ) return null; progDraw.inPos = ShProg.AttrI( progDraw, "inPos" ); progDraw.inNV = ShProg.AttrI( progDraw, "inNV" ); // create sphere var layer_size = 16, circum_size = 32; var rad_circum = 1.0; var rad_tube = 0.5; var sphere_pts = []; var sphere_nv = []; sphere_pts.push( 0.0, 0.0, -rad_circum ); sphere_nv.push( 0.0, 0.0, -1.0 ); for ( var i_l = 1; i_l < layer_size; ++ i_l ) { var angH = (1.0 - i_l / layer_size) * Math.PI; var h = Math.cos( angH ); var r = Math.sin( angH ); for ( var i_c = 0; i_c < circum_size; ++ i_c ) { var circumX = Math.cos(2 * Math.PI * i_c / circum_size); var circumY = Math.sin(2 * Math.PI * i_c / circum_size); sphere_pts.push( r * circumX * rad_circum, r * circumY * rad_circum, h * rad_circum ); sphere_nv.push( r * circumX, r * circumY, h ); } } sphere_pts.push( 0.0, 0.0, rad_circum ); sphere_nv.push( 0.0, 0.0, 1.0 ); var sphere_inx = []; for ( var i_c = 0; i_c < circum_size; ++ i_c ) { sphere_inx.push( i_c+1, 0, (i_c+1) % circum_size + 1 ) } for ( var i_l = 0; i_l < layer_size-2; ++ i_l ) { var l1 = i_l * circum_size + 1; var l2 = (i_l+1) * circum_size + 1 for ( var i_c = 0; i_c < circum_size; ++ i_c ) { var i_n = (i_c+1) % circum_size; sphere_inx.push( l1+i_c, l1+i_n, l2+i_c, l1+i_n, l2+i_n, l2+i_c ); } } for ( var i_c = 0; i_c < circum_size; ++ i_c ) { var i_start = 1 + (layer_size-2) * circum_size; var i_n = (i_c+1) % circum_size; sphere_inx.push( i_start + i_c, i_start + i_n, sphere_pts.length/3-1 ); } bufCube = VertexBuffer.Create( [ { data : sphere_pts, attrSize : 3, attrLoc : progDraw.inPos }, { data : sphere_nv, attrSize : 3, attrLoc : progDraw.inNV } ], sphere_inx ); window.onresize = resize; resize(); requestAnimationFrame(render); } function Fract( val ) { return val - Math.trunc( val ); } function CalcAng( deltaTime, intervall ) { return Fract( deltaTime / (1000*intervall) ) * 2.0 * Math.PI; } function CalcMove( deltaTime, intervall, range ) { var pos = self.Fract( deltaTime / (1000*intervall) ) * 2.0 var pos = pos < 1.0 ? pos : (2.0-pos) return range[0] + (range[1] - range[0]) * pos; } function EllipticalPosition( a, b, angRag ) { var a_b = a * a - b * b var ea = (a_b <= 0) ? 0 : Math.sqrt( a_b ); var eb = (a_b >= 0) ? 0 : Math.sqrt( -a_b ); return [ a * Math.sin( angRag ) - ea, b * Math.cos( angRag ) - eb, 0 ]; } glArrayType = typeof Float32Array !="undefined" ? Float32Array : ( typeof WebGLFloatArray != "undefined" ? WebGLFloatArray : Array ); function IdentM44() { var m = new glArrayType(16); m[0] = 1; m[1] = 0; m[2] = 0; m[3] = 0; m[4] = 0; m[5] = 1; m[6] = 0; m[7] = 0; m[8] = 0; m[9] = 0; m[10] = 1; m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1; return m; }; function RotateAxis(matA, angRad, axis) { var aMap = [ [1, 2], [2, 0], [0, 1] ]; var a0 = aMap[axis][0], a1 = aMap[axis][1]; var sinAng = Math.sin(angRad), cosAng = Math.cos(angRad); var matB = new glArrayType(16); for ( var i = 0; i < 16; ++ i ) matB[i] = matA[i]; for ( var i = 0; i < 3; ++ i ) { matB[a0*4+i] = matA[a0*4+i] * cosAng + matA[a1*4+i] * sinAng; matB[a1*4+i] = matA[a0*4+i] * -sinAng + matA[a1*4+i] * cosAng; } return matB; } function Cross( a, b ) { return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0], 0.0 ]; } function Dot( a, b ) { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; } function Normalize( v ) { var len = Math.sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] ); return [ v[0] / len, v[1] / len, v[2] / len ]; } var Camera = {}; Camera.create = function() { this.pos = [0, 1.5, 0.0]; this.target = [0, 0, 0]; this.up = [0, 0, 1]; this.fov_y = 90; this.vp = [800, 600]; this.near = 0.5; this.far = 100.0; } Camera.Perspective = function() { var fn = this.far + this.near; var f_n = this.far - this.near; var r = this.vp[0] / this.vp[1]; var t = 1 / Math.tan( Math.PI * this.fov_y / 360 ); var m = IdentM44(); m[0] = t/r; m[1] = 0; m[2] = 0; m[3] = 0; m[4] = 0; m[5] = t; m[6] = 0; m[7] = 0; m[8] = 0; m[9] = 0; m[10] = -fn / f_n; m[11] = -1; m[12] = 0; m[13] = 0; m[14] = -2 * this.far * this.near / f_n; m[15] = 0; return m; } Camera.LookAt = function() { var mz = Normalize( [ this.pos[0]-this.target[0], this.pos[1]-this.target[1], this.pos[2]-this.target[2] ] ); var mx = Normalize( Cross( this.up, mz ) ); var my = Normalize( Cross( mz, mx ) ); var tx = Dot( mx, this.pos ); var ty = Dot( my, this.pos ); var tz = Dot( [-mz[0], -mz[1], -mz[2]], this.pos ); var m = IdentM44(); m[0] = mx[0]; m[1] = my[0]; m[2] = mz[0]; m[3] = 0; m[4] = mx[1]; m[5] = my[1]; m[6] = mz[1]; m[7] = 0; m[8] = mx[2]; m[9] = my[2]; m[10] = mz[2]; m[11] = 0; m[12] = tx; m[13] = ty; m[14] = tz; m[15] = 1; return m; } var ShProg = { Create: function (shaderList) { var shaderObjs = []; for (var i_sh = 0; i_sh < shaderList.length; ++i_sh) { var shderObj = this.Compile(shaderList[i_sh].source, shaderList[i_sh].stage); if (shderObj) shaderObjs.push(shderObj); } var prog = {} prog.progObj = this.Link(shaderObjs) if (prog.progObj) { prog.attrInx = {}; var noOfAttributes = gl.getProgramParameter(prog.progObj, gl.ACTIVE_ATTRIBUTES); for (var i_n = 0; i_n < noOfAttributes; ++i_n) { var name = gl.getActiveAttrib(prog.progObj, i_n).name; prog.attrInx[name] = gl.getAttribLocation(prog.progObj, name); } prog.uniLoc = {}; var noOfUniforms = gl.getProgramParameter(prog.progObj, gl.ACTIVE_UNIFORMS); for (var i_n = 0; i_n < noOfUniforms; ++i_n) { var name = gl.getActiveUniform(prog.progObj, i_n).name; prog.uniLoc[name] = gl.getUniformLocation(prog.progObj, name); } } return prog; }, AttrI: function (prog, name) { return prog.attrInx[name]; }, UniformL: function (prog, name) { return prog.uniLoc[name]; }, Use: function (prog) { gl.useProgram(prog.progObj); }, SetI1: function (prog, name, val) { if (prog.uniLoc[name]) gl.uniform1i(prog.uniLoc[name], val); }, SetF1: function (prog, name, val) { if (prog.uniLoc[name]) gl.uniform1f(prog.uniLoc[name], val); }, SetF2: function (prog, name, arr) { if (prog.uniLoc[name]) gl.uniform2fv(prog.uniLoc[name], arr); }, SetF3: function (prog, name, arr) { if (prog.uniLoc[name]) gl.uniform3fv(prog.uniLoc[name], arr); }, SetF4: function (prog, name, arr) { if (prog.uniLoc[name]) gl.uniform4fv(prog.uniLoc[name], arr); }, SetM33: function (prog, name, mat) { if (prog.uniLoc[name]) gl.uniformMatrix3fv(prog.uniLoc[name], false, mat); }, SetM44: function (prog, name, mat) { if (prog.uniLoc[name]) gl.uniformMatrix4fv(prog.uniLoc[name], false, mat); }, Compile: function (source, shaderStage) { var shaderScript = document.getElementById(source); if (shaderScript) source = shaderScript.text; var shaderObj = gl.createShader(shaderStage); gl.shaderSource(shaderObj, source); gl.compileShader(shaderObj); var status = gl.getShaderParameter(shaderObj, gl.COMPILE_STATUS); if (!status) alert(gl.getShaderInfoLog(shaderObj)); return status ? shaderObj : null; }, Link: function (shaderObjs) { var prog = gl.createProgram(); for (var i_sh = 0; i_sh < shaderObjs.length; ++i_sh) gl.attachShader(prog, shaderObjs[i_sh]); gl.linkProgram(prog); status = gl.getProgramParameter(prog, gl.LINK_STATUS); if ( !status ) alert(gl.getProgramInfoLog(prog)); return status ? prog : null; } }; var VertexBuffer = { Create: function(attribs, indices, type) { var buffer = { buf: [], attr: [], inx: gl.createBuffer(), inxLen: indices.length, primitive_type: type ? type : gl.TRIANGLES }; for (var i=0; i 0 ) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer.inx); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array( indices ), gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); } return buffer; }, Draw: function(bufObj) { for (var i=0; i 0 ) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufObj.inx); gl.drawElements(bufObj.primitive_type, bufObj.inxLen, gl.UNSIGNED_SHORT, 0); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null ); } else gl.drawArrays(bufObj.primitive_type, 0, bufObj.attr[0].no_of ); for (var i=0; i precision highp float; attribute vec3 inPos; attribute vec3 inNV; varying vec4 v_clip_pos; uniform mat4 u_projectionMat44; uniform mat4 u_viewMat44; uniform mat4 u_modelMat44; void main() { vec4 pos = u_viewMat44 * u_modelMat44 * vec4( inPos, 1.0 ); v_clip_pos = u_projectionMat44 * pos; gl_Position = v_clip_pos; }

Figure 5. The warmer colors of an urban environment. Washington, D.C. Nikon D700 with Nikon 35mm f/2 lens. 30 seconds, f/16, ISO 200.

I can hear the naysayers already. What color? There is very little color at night. True. Sort of. While there is not an abundance of natural color at night, we do have the opportunity to add our own, with light painting. And we can do that with greater effect if we understand and use the concepts of how the color of light affects perception.

Figure 9 is an image I made at Battery Spencer on our 2019 San Francisco workshop. It was an exciting night due to the dense fog rolling in from the sea. The fog was glowing with the dominant color of the city’s sodium vapor lights.

Equipped with one 55 Watt twin-tube Philips daylight fluorescent lamp that supplies almost 2 times the illumination of the most popular desk lamps. All aluminum ...

To calculate a diffuse light or even specular hight lights, you have to know the normal vector of the surface respectively fragment. The diffuse light radiance depends on the the direction of the incident light - see How does this faking the light work on aerotwist?. Specular highlights additionally depend on the direct of view.

Whether we know it or not, color has a big impact on our lives. From the color of our house to the clothes we wear, color is a quiet indicator of who we are and what we like. You look great in that color, are you a Summer? I am a Winter.

Alter the color of your light painting tool to affect either dissonance or harmony. In the case of a Luxli Cello or Viola, you can simply dial in the color temperature to contrast or unite the colors of the scene. If you are using a flashlight, first determine its actual color (see earlier blog posts on correcting the color of your flashlight), then alter the color of the light by using gels.

Updated daily, the best resource guide for news, products and technology from Laser World of Photonics. Product updates, news, datasheets and whitepapers ...

For the image in Figure 8, I chose to light paint a pale blue truck with an unfiltered Coast HP5R flashlight. I shot this image on a full-moon night with the camera’s white balance set to 4000 K. The cooler white balance kept the sky looking more blue (a warmer white balance of Daylight/Direct Sun/5500 K would have rendered the sky somewhat colorless). This cooler white balance also influenced the color of the flashlight. Here, the HP5R (like many other LED flashlights) has a slight blue cast. The cooler white balance, then, has pushed the color of my flashlight even more blue. Couple that with the blue sky and you get classic color harmony.

When using analogous colors together, you are creating a color scheme that is less punchy. It increases color unity and decreases color contrast.

In most circumstances I would have lowered the Kelvin temperature on my camera to neutralize this heavy orange cast. In this case I decided to stick with a Direct Sun (5500 K) white balance setting to render the city light as it was. This gave the ambient scene an otherworldly sort of look.