107 lines
2.9 KiB
C++
107 lines
2.9 KiB
C++
#include "fs_classic_phong.h"
|
|
#include "asset/dvc_material.h"
|
|
#include "pipe/dvc_render_pipe.h"
|
|
#include "shader/dvc_shader_functions.h"
|
|
|
|
using namespace davinci;
|
|
|
|
const char* ClassicFragementShader_Phong::getName(void) const
|
|
{
|
|
return "classic:phong";
|
|
}
|
|
|
|
bool ClassicFragementShader_Phong::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc)
|
|
{
|
|
m_pipe = pipe;
|
|
const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
|
|
|
if(!(material->getParam("u_materialColor", m_materialColor)))
|
|
{
|
|
m_materialColor = davinci::fVector4::WHITE;
|
|
}
|
|
if(!(material->getParam("u_specularShininess", m_specularShininess)))
|
|
{
|
|
m_specularShininess = 64.0f;
|
|
}
|
|
if (!(material->getParam("u_specularStrength", m_specularStrength)))
|
|
{
|
|
m_specularStrength = 5.0f;
|
|
}
|
|
|
|
if (const davinci::fVector3* attribute = (davinci::fVector3*)(uniformBuffer.getAttribute("ambient_light:color")))
|
|
{
|
|
m_ambientLightColor = *attribute;
|
|
}
|
|
else
|
|
{
|
|
m_ambientLightColor = davinci::fVector3(0.2f, 0.2f, 0.2f);
|
|
}
|
|
|
|
if (const davinci::fVector3* attribute = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:position")))
|
|
{
|
|
m_light0Position = *attribute;
|
|
}
|
|
else return false;
|
|
|
|
if (const davinci::fVector3* attribute = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:color")))
|
|
{
|
|
m_light0Color = *attribute;
|
|
}
|
|
else return false;
|
|
|
|
if (const davinci::fVector3* attribute = (davinci::fVector3*)(uniformBuffer.getAttribute("camera:eye_pos")))
|
|
{
|
|
m_cameraPosition = *attribute;
|
|
}
|
|
else return false;
|
|
|
|
if (const VertexDesc::Element* element = veretexDesc.getElementByType(davinci::VET_POSITION_WORLD))
|
|
{
|
|
m_vWorldPosOffset = element->offset / sizeof(float32_t);
|
|
}
|
|
else return false;
|
|
|
|
if (const VertexDesc::Element* element = veretexDesc.getElementByType(davinci::VET_NORMAL))
|
|
{
|
|
m_vNormalOffset = element->offset / sizeof(float32_t);
|
|
}
|
|
else return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void ClassicFragementShader_Phong::process(const float32_t* pixelData, davinci::fVector4& color)
|
|
{
|
|
fVector3 v_worldpos = *((const fVector3*)(pixelData + m_vWorldPosOffset));
|
|
fVector3 v_normal = *((const fVector3*)(pixelData + m_vNormalOffset));
|
|
|
|
fVector3 toLight = m_light0Position - v_worldpos;
|
|
toLight.normalise();
|
|
|
|
fVector3 toCamera = m_cameraPosition - v_worldpos;
|
|
toCamera.normalise();
|
|
|
|
float32_t ndotl = toLight.dotProduct(v_normal);
|
|
fVector3 vR = 2 * ndotl*v_normal - toLight;
|
|
float32_t rdotv = vR.dotProduct(toCamera);
|
|
|
|
fVector3 colAmbient = m_ambientLightColor * m_materialColor.xyz();
|
|
|
|
fVector3 colDiffuse = shader::max(0.0f, ndotl) * m_light0Color * m_materialColor.xyz();
|
|
|
|
float32_t specular = shader::step(0.f, ndotl) * m_specularStrength * shader::pow(shader::max(0.0f, rdotv), m_specularShininess);
|
|
fVector3 colSpecular = specular * m_light0Color;
|
|
|
|
fVector3 final = fVector3::BLACK;
|
|
final += colAmbient;
|
|
final += colDiffuse;
|
|
final += colSpecular;
|
|
|
|
color = fVector4(final.saturate(), 1.0f);
|
|
}
|
|
|
|
void ClassicFragementShader_Phong::end()
|
|
{
|
|
}
|
|
|