在FragementShader的begin函数中准备输入的顶点数据偏移
This commit is contained in:
@@ -10,41 +10,70 @@ const char* ClassicFragementShader_Phong::getName(void) const
|
||||
return "classic:phong";
|
||||
}
|
||||
|
||||
void ClassicFragementShader_Phong::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
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();
|
||||
|
||||
material->getParam("u_materialColor", m_materialColor);
|
||||
material->getParam("u_specularShininess", m_specularShininess);
|
||||
material->getParam("u_specularStrength", m_specularStrength);
|
||||
|
||||
if (davinci::fVector3* p_ambient_light_color = (davinci::fVector3*)(uniformBuffer.getAttribute("ambient_light:color")))
|
||||
if(!(material->getParam("u_materialColor", m_materialColor)))
|
||||
{
|
||||
m_ambientLightColor = *p_ambient_light_color;
|
||||
m_materialColor = davinci::fVector4::WHITE;
|
||||
}
|
||||
if (davinci::fVector3* p_light0_position = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:position")))
|
||||
if(!(material->getParam("u_specularShininess", m_specularShininess)))
|
||||
{
|
||||
m_light0Position = *p_light0_position;
|
||||
m_specularShininess = 64.0f;
|
||||
}
|
||||
if (davinci::fVector3* p_light0_color = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:color")))
|
||||
if (!(material->getParam("u_specularStrength", m_specularStrength)))
|
||||
{
|
||||
m_light0Color = *p_light0_color;
|
||||
m_specularStrength = 5.0f;
|
||||
}
|
||||
|
||||
if (davinci::fVector3* p_camera_position = (davinci::fVector3*)(uniformBuffer.getAttribute("camera:eye_pos")))
|
||||
if (const davinci::fVector3* attribute = (davinci::fVector3*)(uniformBuffer.getAttribute("ambient_light:color")))
|
||||
{
|
||||
m_cameraPosition = *p_camera_position;
|
||||
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 davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void ClassicFragementShader_Phong::process(const float32_t* pixelData, davinci::fVector4& color)
|
||||
{
|
||||
const VertexDesc::Element* v_worldpos_Element = veretexDesc.getElement(davinci::VET_POSITION_WORLD);
|
||||
fVector3 v_worldpos = v_worldpos_Element ? *((const fVector3*)(pixelData + (v_worldpos_Element->offset / sizeof(float32_t)))) : fVector3::ZERO;
|
||||
|
||||
const VertexDesc::Element* v_normal_Element = veretexDesc.getElement(davinci::VET_NORMAL);
|
||||
fVector3 v_normal = v_normal_Element ? *((const fVector3*)(pixelData + (v_normal_Element->offset / sizeof(float32_t)))) : fVector3::UNIT_Z;
|
||||
fVector3 v_worldpos = *((const fVector3*)(pixelData + m_vWorldPosOffset));
|
||||
fVector3 v_normal = *((const fVector3*)(pixelData + m_vNormalOffset));
|
||||
|
||||
fVector3 toLight = m_light0Position - v_worldpos;
|
||||
toLight.normalise();
|
||||
|
||||
Reference in New Issue
Block a user