#include "test_pixel_shader.h" const char* TestPixelShader::getName(void) const { return "test_pixel_shader"; } void TestPixelShader::prepare(const davinci::UniformBuffer* uniformBuffer, SetInputAttributeFunc setInputAttributeFunc) { } void TestPixelShader::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) { const davinci::VertexDesc::Element* v_position_Element = veretexDesc.getElement("v_position"); const davinci::fVector3* v_position = (const davinci::fVector3*)(pixelData + (v_position_Element->offset / sizeof(float32_t))); const davinci::VertexDesc::Element* v_normal_Element = veretexDesc.getElement("v_normal"); const davinci::fVector3* v_normal = (const davinci::fVector3*)(pixelData + (v_normal_Element->offset / sizeof(float32_t))); const davinci::VertexDesc::Element* v_uv_Element = veretexDesc.getElement("v_uv"); const float32_t* v_uv = (const float32_t*)(pixelData + (v_uv_Element->offset / sizeof(float32_t))); const davinci::VertexDesc::Element* v_toCamera_Element = veretexDesc.getElement("v_toCamera"); const davinci::fVector3* v_toCamera = (const davinci::fVector3*)(pixelData + (v_toCamera_Element->offset / sizeof(float32_t))); const davinci::VertexDesc::Element* v_toLight_Element = veretexDesc.getElement("v_toLight"); const davinci::fVector3* v_toLight = (const davinci::fVector3*)(pixelData + (v_toLight_Element->offset / sizeof(float32_t))); const davinci::VertexDesc::Element* v_color0_Element = veretexDesc.getElement("v_color0"); const davinci::fVector3* v_color0 = (const davinci::fVector3*)(pixelData + (v_color0_Element->offset / sizeof(float32_t))); //vector vL = normalize(v_toLight); davinci::fVector3 vL = *v_toLight; vL.normalise(); //vector vV = normalize(v_toCamera); davinci::fVector3 vV = *v_toCamera; vV.normalise(); //vector vN = normalize(v_normal); davinci::fVector3 vN = *v_normal; vN.normalise(); //vector vR = 2 * dot(vL, vN)*vN - vL; davinci::fVector3 vR = 2 * vL.dotProduct(vN) * vN - vL; //vector vH = normalize(vL + vV); davinci::fVector3 vH = vL + vV; vH.normalise(); davinci::fVector3 u_ambientColor = davinci::fVector3(0.1, 0.1, 0.1); davinci::fVector3 u_matColor = davinci::fVector3(1.0, 0.5, 0.7); davinci::fVector3 u_lightColor = davinci::fVector3(1.0, 1.0, 1.0); //color colAmbient = u_ambientColor*u_matColor; davinci::fVector3 colAmbient = u_ambientColor * u_matColor; //float ndotl = max(dot(vN, vL), 0); float32_t ndotl = std::max(vN.dotProduct(vL), 0.0f); //color colDiff = ndotl * u_matColor * u_lightColor; davinci::fVector3 colDiff = ndotl * u_matColor * u_lightColor; //float spec = max(dot(vN, vH), 0); float32_t spec = std::max(vN.dotProduct(vH), 0.0f); //color colSpec = step(0, ndotl) * pow(spec, 64) * u_matColor * u_lightColor; davinci::fVector3 colSpec = (ndotl < 0.f ? 0.0 : 1.0) * std::powf(spec, 64.f) * u_matColor * u_lightColor; //color final = colAmbient + colDiff + colSpec; davinci::fVector3 final = colAmbient + colDiff + colSpec; //davinci::fVector3 final = *v_color0; color = davinci::fVector4(final.saturate(), 1.0f);// davinci::fVector4::RED; }