sRGBAfloat cRenderWorker::ObjectShader( const sShaderInputData &_input, sRGBAfloat *surfaceColour, sRGBAfloat *specularOut) { sRGBAfloat output; // normal vector CVector3 vn = _input.normal; sShaderInputData input = _input; cMaterial *mat = input.material; input.normal = vn; // main light sRGBAfloat mainLight; mainLight.R = params->mainLightIntensity * params->mainLightColour.R / 65536.0; mainLight.G = params->mainLightIntensity * params->mainLightColour.G / 65536.0; mainLight.B = params->mainLightIntensity * params->mainLightColour.B / 65536.0; // calculate shading based on angle of incidence sRGBAfloat shade; if (params->mainLightEnable) { shade = MainShading(input); shade.R = params->mainLightIntensity * ((1.0 - mat->shading) + mat->shading * shade.R); shade.G = params->mainLightIntensity * ((1.0 - mat->shading) + mat->shading * shade.G); shade.B = params->mainLightIntensity * ((1.0 - mat->shading) + mat->shading * shade.B); } // calculate shadow sRGBAfloat shadow(1.0, 1.0, 1.0, 1.0); if (params->shadow && params->mainLightEnable) shadow = MainShadow(input); // calculate specular highlight sRGBAfloat specular; if (params->mainLightEnable) { specular = MainSpecular(input); specular.R *= mat->specular; specular.G *= mat->specular; specular.B *= mat->specular; } // calculate surface colour sRGBAfloat colour = SurfaceColour(input); double texColInt = mat->colorTextureIntensity; double texColIntN = 1.0 - mat->colorTextureIntensity; colour.R *= input.texColor.R * texColInt + texColIntN; colour.G *= input.texColor.G * texColInt + texColIntN; colour.B *= input.texColor.B * texColInt + texColIntN; *surfaceColour = colour; // ambient occlusion sRGBAfloat ambient(0.0, 0.0, 0.0, 0.0); if (params->ambientOcclusionEnabled) { // fast mode if (params->ambientOcclusionMode == params::AOmodeFast) { ambient = FastAmbientOcclusion(input); } else if (params->ambientOcclusionMode == params::AOmodeMultipeRays) { ambient = AmbientOcclusion(input); } } sRGBAfloat ambient2; ambient2.R = ambient.R * params->ambientOcclusion; ambient2.G = ambient.G * params->ambientOcclusion; ambient2.B = ambient.B * params->ambientOcclusion; // environment mapping sRGBAfloat envMapping(0.0, 0.0, 0.0, 0.0); if (params->envMappingEnable) { envMapping = EnvMapping(input); } envMapping.R *= mat->reflectance * input.texDiffuse.R; envMapping.G *= mat->reflectance * input.texDiffuse.G; envMapping.B *= mat->reflectance * input.texDiffuse.B; // additional lights sRGBAfloat auxLights; sRGBAfloat auxLightsSpecular; auxLights = AuxLightsShader(input, &auxLightsSpecular); // fake orbit trap lights sRGBAfloat fakeLights(0.0, 0.0, 0.0, 0.0); sRGBAfloat fakeLightsSpecular(0.0, 0.0, 0.0, 0.0); if (params->fakeLightsEnabled) { fakeLights = FakeLights(input, &fakeLightsSpecular); } // luminosity sRGBAfloat luminosity; luminosity.R = input.texLuminosity.R * mat->luminosityTextureIntensity + mat->luminosity * mat->luminosityColor.R / 65536.0; luminosity.G = input.texLuminosity.G * mat->luminosityTextureIntensity + mat->luminosity * mat->luminosityColor.G / 65536.0; luminosity.B = input.texLuminosity.B * mat->luminosityTextureIntensity + mat->luminosity * mat->luminosityColor.B / 65536.0; // total shader output.R = envMapping.R + (ambient2.R + mainLight.R * shade.R * shadow.R) * colour.R; output.G = envMapping.G + (ambient2.G + mainLight.G * shade.G * shadow.G) * colour.G; output.B = envMapping.B + (ambient2.B + mainLight.B * shade.B * shadow.B) * colour.B; output.R += (auxLights.R + fakeLights.R) * colour.R; output.G += (auxLights.G + fakeLights.G) * colour.G; output.B += (auxLights.B + fakeLights.B) * colour.B; output.R += luminosity.R; output.G += luminosity.G; output.B += luminosity.B; output.A = 1.0; specularOut->R = auxLightsSpecular.R + fakeLightsSpecular.R + mainLight.R * specular.R * shadow.R; specularOut->G = auxLightsSpecular.G + fakeLightsSpecular.G + mainLight.G * specular.G * shadow.G; specularOut->B = auxLightsSpecular.B + fakeLightsSpecular.B + mainLight.B * specular.B * shadow.B; specularOut->A = output.A; return output; }
sRGBAfloat cRenderWorker::ObjectShader(const sShaderInputData &_input, sRGBAfloat *surfaceColour, sRGBAfloat *specularOut) { sRGBAfloat output; //normal vector CVector3 vn = _input.normal; sShaderInputData input = _input; input.normal = vn; sRGBAfloat mainLight; mainLight.R = params->mainLightIntensity * params->mainLightColour.R / 65536.0; mainLight.G = params->mainLightIntensity * params->mainLightColour.G / 65536.0; mainLight.B = params->mainLightIntensity * params->mainLightColour.B / 65536.0; //calculate shading based on angle of incidence sRGBAfloat shade; if (params->mainLightEnable) { shade = MainShading(input); shade.R = params->mainLightIntensity * ((1.0 - params->shading) + params->shading * shade.R); shade.G = params->mainLightIntensity * ((1.0 - params->shading) + params->shading * shade.G); shade.B = params->mainLightIntensity * ((1.0 - params->shading) + params->shading * shade.B); } //calculate shadow sRGBAfloat shadow(1.0, 1.0, 1.0, 1.0); if (params->shadow && params->mainLightEnable) shadow = MainShadow(input); //calculate specular highlight sRGBAfloat specular; if (params->mainLightEnable) { specular = MainSpecular(input); specular.R *= params->specular; specular.G *= params->specular; specular.B *= params->specular; } //calculate surface colour sRGBAfloat colour = SurfaceColour(input); *surfaceColour = colour; //ambient occlusion sRGBAfloat ambient(0.0, 0.0, 0.0, 0.0); if (params->ambientOcclusionEnabled) { //fast mode if (params->ambientOcclusionMode == params::AOmodeFast) { ambient = FastAmbientOcclusion(input); } else if (params->ambientOcclusionMode == params::AOmodeMultipeRays) { ambient = AmbientOcclusion(input); } } sRGBAfloat ambient2; ambient2.R = ambient.R * params->ambientOcclusion; ambient2.G = ambient.G * params->ambientOcclusion; ambient2.B = ambient.B * params->ambientOcclusion; //environment mapping sRGBAfloat envMapping(0.0, 0.0, 0.0, 0.0); if (params->envMappingEnable) { envMapping = EnvMapping(input); } envMapping.R *= params->reflect; envMapping.G *= params->reflect; envMapping.B *= params->reflect; //additional lights sRGBAfloat auxLights; sRGBAfloat auxLightsSpecular; auxLights = AuxLightsShader(input, &auxLightsSpecular); //fake orbit trap lights sRGBAfloat fakeLights(0.0, 0.0, 0.0, 0.0); sRGBAfloat fakeLightsSpecular(0.0, 0.0, 0.0, 0.0); if (params->fakeLightsEnabled) { fakeLights = FakeLights(input, &fakeLightsSpecular); } //total shader output.R = envMapping.R + (ambient2.R + mainLight.R * shade.R * shadow.R) * colour.R; output.G = envMapping.G + (ambient2.G + mainLight.G * shade.G * shadow.G) * colour.G; output.B = envMapping.B + (ambient2.B + mainLight.B * shade.B * shadow.B) * colour.B; output.R += (auxLights.R + fakeLights.R) * colour.R; output.G += (auxLights.G + fakeLights.G) * colour.G; output.B += (auxLights.B + fakeLights.B) * colour.B; output.A = 1.0; (*specularOut).R = auxLightsSpecular.R + fakeLightsSpecular.R + mainLight.R * specular.R * shadow.R; (*specularOut).G = auxLightsSpecular.G + fakeLightsSpecular.G + mainLight.G * specular.G * shadow.G; (*specularOut).B = auxLightsSpecular.B + fakeLightsSpecular.B + mainLight.B * specular.B * shadow.B; (*specularOut).A = output.A; return output; }