Files
davinci2/test/shader/test_pixel_shader.cpp
T
2025-06-11 22:45:11 +08:00

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;
}