76 lines
3.1 KiB
C++
76 lines
3.1 KiB
C++
#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;
|
|
} |