diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index f52091eabdcd84..470bda45fc80ce 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -680,7 +680,9 @@ function WebGLRenderer( parameters ) { this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { - state.setMaterial( material ); + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); var program = setProgram( camera, fog, material, object ); var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); @@ -1429,7 +1431,9 @@ function WebGLRenderer( parameters ) { if ( object.isImmediateRenderObject ) { - state.setMaterial( material ); + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); var program = setProgram( camera, scene.fog, material, object ); diff --git a/src/renderers/webgl/WebGLState.js b/src/renderers/webgl/WebGLState.js index 7ab6555f9c1912..a35895b0266905 100644 --- a/src/renderers/webgl/WebGLState.js +++ b/src/renderers/webgl/WebGLState.js @@ -646,13 +646,16 @@ function WebGLState( gl, extensions, utils ) { } - function setMaterial( material ) { + function setMaterial( material, frontFaceCW ) { material.side === DoubleSide ? disable( gl.CULL_FACE ) : enable( gl.CULL_FACE ); - setFlipSided( material.side === BackSide ); + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); material.transparent === true ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )