在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();
|
||||
|
||||
@@ -8,11 +8,10 @@ class ClassicFragementShader_Phong : public davinci::FragementShaderInterface
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
virtual void end();
|
||||
private:
|
||||
const davinci::RenderPipe* m_pipe = nullptr;
|
||||
davinci::fVector4 m_materialColor = davinci::fVector4::WHITE;
|
||||
@@ -20,8 +19,10 @@ private:
|
||||
float32_t m_specularStrength = 5.0f;
|
||||
|
||||
davinci::fVector3 m_ambientLightColor = davinci::fVector3(0.2f, 0.2f, 0.2f);
|
||||
davinci::fVector3 m_light0Position = davinci::fVector3::ZERO;
|
||||
davinci::fVector3 m_light0Color = davinci::fVector3::WHITE;
|
||||
davinci::fVector3 m_light0Position;
|
||||
davinci::fVector3 m_light0Color;
|
||||
davinci::fVector3 m_cameraPosition;
|
||||
|
||||
davinci::fVector3 m_cameraPosition = davinci::fVector3::ZERO;
|
||||
size_t m_vWorldPosOffset;
|
||||
size_t m_vNormalOffset;
|
||||
};
|
||||
|
||||
@@ -5,29 +5,37 @@
|
||||
#include "shader/dvc_shader_functions.h"
|
||||
#include "pipe/dvc_render_pipe.h"
|
||||
|
||||
using namespace davinci;
|
||||
|
||||
const char* DebugFragementShader_GeometryNormal::getName(void) const
|
||||
{
|
||||
return "debug:geometry_normal";
|
||||
}
|
||||
|
||||
void DebugFragementShader_GeometryNormal::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
bool DebugFragementShader_GeometryNormal::begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc)
|
||||
{
|
||||
m_pipe = pipe;
|
||||
m_material = material;
|
||||
|
||||
if (const VertexDesc::Element* element = veretexDesc.getElementByType(VET_NORMAL))
|
||||
{
|
||||
m_vNormalOffset = element->offset / sizeof(float32_t);
|
||||
}
|
||||
else return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebugFragementShader_GeometryNormal::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void DebugFragementShader_GeometryNormal::process(const float32_t* pixelData, fVector4& color)
|
||||
{
|
||||
const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
const UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
|
||||
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)));
|
||||
fVector3 v_normal = *((const fVector3*)(pixelData + m_vNormalOffset));
|
||||
|
||||
davinci::fVector3 normalColor = *v_normal;
|
||||
fVector3 normalColor = v_normal;
|
||||
normalColor.normalise();
|
||||
|
||||
normalColor = normalColor * 0.5f + 0.5f;
|
||||
color = davinci::fVector4(normalColor, 1);
|
||||
color = fVector4(normalColor, 1);
|
||||
}
|
||||
|
||||
void DebugFragementShader_GeometryNormal::end()
|
||||
|
||||
@@ -8,14 +8,11 @@ class DebugFragementShader_GeometryNormal : public davinci::FragementShaderInter
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
|
||||
virtual void end();
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
private:
|
||||
const davinci::RenderPipe* m_pipe = nullptr;
|
||||
davinci::MaterialConstPtr m_material;
|
||||
size_t m_vNormalOffset;
|
||||
};
|
||||
|
||||
@@ -5,33 +5,40 @@
|
||||
#include "shader/dvc_shader_functions.h"
|
||||
#include "pipe/dvc_render_pipe.h"
|
||||
|
||||
using namespace davinci;
|
||||
|
||||
const char* DebugFragementShader_ShowTexture::getName(void) const
|
||||
{
|
||||
return "debug:show_texture";
|
||||
}
|
||||
|
||||
void DebugFragementShader_ShowTexture::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
bool DebugFragementShader_ShowTexture::begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc)
|
||||
{
|
||||
m_pipe = pipe;
|
||||
m_material = material;
|
||||
|
||||
material->getParam("u_textureInfo", m_textureInfo);
|
||||
if (!(material->getParam("u_textureInfo", m_textureInfo)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (const VertexDesc::Element* element = veretexDesc.getElementByType(static_cast<VertexElementType>(VET_TEXCOORD_0+m_textureInfo.texCoord)))
|
||||
{
|
||||
m_vTextureCoordinateOffset = element->offset / sizeof(float32_t);
|
||||
}
|
||||
else return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebugFragementShader_ShowTexture::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void DebugFragementShader_ShowTexture::process(const float32_t* pixelData, fVector4& color)
|
||||
{
|
||||
const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
const fVector2* v_TextureCoordinate = (const fVector2*)(pixelData + m_vTextureCoordinateOffset);
|
||||
|
||||
const davinci::VertexDesc::Element* v_uv_Element = veretexDesc.getElement("v_uv");
|
||||
const davinci::fVector2* v_uv = (const davinci::fVector2*)(pixelData + (v_uv_Element->offset / sizeof(float32_t)));
|
||||
|
||||
davinci::fVector4 textureColor = davinci::shader::texture2D(*m_pipe,
|
||||
m_textureInfo, (*v_uv), davinci::fVector4::WHITE);
|
||||
fVector4 textureColor = shader::texture2D(*m_pipe, m_textureInfo, (*v_TextureCoordinate), fVector4::WHITE);
|
||||
|
||||
color = textureColor;
|
||||
}
|
||||
void DebugFragementShader_ShowTexture::end()
|
||||
{
|
||||
m_material.reset();
|
||||
m_textureInfo.texture.reset();
|
||||
}
|
||||
|
||||
@@ -9,16 +9,13 @@ class DebugFragementShader_ShowTexture : public davinci::FragementShaderInterfac
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
|
||||
virtual void end();
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
private:
|
||||
const davinci::RenderPipe* m_pipe = nullptr;
|
||||
davinci::MaterialConstPtr m_material;
|
||||
|
||||
davinci::TextureInfo m_textureInfo;
|
||||
size_t m_vTextureCoordinateOffset;
|
||||
};
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
#include "fs_debug_solid_color.h"
|
||||
#include "asset/dvc_material.h"
|
||||
|
||||
using namespace davinci;
|
||||
|
||||
const char* DebugFragementShader_SolidColor::getName(void) const
|
||||
{
|
||||
return "debug:solid_color";
|
||||
}
|
||||
|
||||
void DebugFragementShader_SolidColor::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
bool DebugFragementShader_SolidColor::begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc)
|
||||
{
|
||||
material->getParam("u_solidColor", m_solidColor);
|
||||
if (!(material->getParam("u_solidColor", m_solidColor)))
|
||||
{
|
||||
m_solidColor = davinci::fVector4::WHITE;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebugFragementShader_SolidColor::process( const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void DebugFragementShader_SolidColor::process(const float32_t* pixelData, fVector4& color)
|
||||
{
|
||||
color = m_solidColor;
|
||||
}
|
||||
|
||||
@@ -8,12 +8,9 @@ class DebugFragementShader_SolidColor : public davinci::FragementShaderInterface
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
|
||||
virtual void end();
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
private:
|
||||
davinci::fVector4 m_solidColor = davinci::fVector4::WHITE;
|
||||
|
||||
@@ -5,31 +5,40 @@
|
||||
#include "shader/dvc_shader_functions.h"
|
||||
#include "pipe/dvc_render_pipe.h"
|
||||
|
||||
using namespace davinci;
|
||||
|
||||
const char* DebugFragementShader_TextureCoordinates::getName(void) const
|
||||
{
|
||||
return "debug:texture_coordinates";
|
||||
}
|
||||
|
||||
void DebugFragementShader_TextureCoordinates::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
bool DebugFragementShader_TextureCoordinates::begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc)
|
||||
{
|
||||
m_pipe = pipe;
|
||||
m_material = material;
|
||||
|
||||
material->getParam("u_texCoord", m_texCoord);
|
||||
if (!(material->getParam("u_texCoord", m_texCoord)))
|
||||
{
|
||||
m_texCoord = 0;
|
||||
}
|
||||
|
||||
if (const VertexDesc::Element* element = veretexDesc.getElementByType(static_cast<VertexElementType>(VET_TEXCOORD_0+m_texCoord)))
|
||||
{
|
||||
m_vTextureCoordinateOffset = element->offset / sizeof(float32_t);
|
||||
}
|
||||
else return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebugFragementShader_TextureCoordinates::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void DebugFragementShader_TextureCoordinates::process(const float32_t* pixelData, fVector4& color)
|
||||
{
|
||||
const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
const fVector2* v_uv = (const fVector2*)(pixelData + m_vTextureCoordinateOffset);
|
||||
|
||||
const davinci::VertexDesc::Element* v_uv_Element = veretexDesc.getElement("v_uv");
|
||||
const davinci::fVector2* v_uv = (const davinci::fVector2*)(pixelData + (v_uv_Element->offset / sizeof(float32_t)));
|
||||
|
||||
davinci::fVector2 uv = *v_uv;
|
||||
fVector2 uv = *v_uv;
|
||||
float uv_x = uv.x - std::floor(uv.x);
|
||||
float uv_y = uv.y - std::floor(uv.y);
|
||||
|
||||
color = davinci::fVector4(uv_x, uv_y, 0, 1);
|
||||
color = fVector4(uv_x, uv_y, 0, 1);
|
||||
}
|
||||
|
||||
void DebugFragementShader_TextureCoordinates::end()
|
||||
|
||||
@@ -8,16 +8,13 @@ class DebugFragementShader_TextureCoordinates : public davinci::FragementShaderI
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
|
||||
virtual void end();
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
private:
|
||||
const davinci::RenderPipe* m_pipe = nullptr;
|
||||
davinci::MaterialConstPtr m_material;
|
||||
|
||||
int32_t m_texCoord=0;
|
||||
size_t m_vTextureCoordinateOffset;
|
||||
};
|
||||
|
||||
@@ -8,13 +8,14 @@ const char* PbrFragementShader_GLTF::getName(void) const
|
||||
return "pbr:gltf";
|
||||
}
|
||||
|
||||
void PbrFragementShader_GLTF::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material)
|
||||
bool PbrFragementShader_GLTF::begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc)
|
||||
{
|
||||
m_pipe = pipe;
|
||||
const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
const UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer();
|
||||
return true;
|
||||
}
|
||||
|
||||
void PbrFragementShader_GLTF::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color)
|
||||
void PbrFragementShader_GLTF::process(const float32_t* pixelData, fVector4& color)
|
||||
{
|
||||
color = fVector4::BLUE;
|
||||
}
|
||||
|
||||
@@ -8,12 +8,9 @@ class PbrFragementShader_GLTF : public davinci::FragementShaderInterface
|
||||
public:
|
||||
virtual const char* getName(void) const;
|
||||
|
||||
virtual void begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material);
|
||||
|
||||
virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData,
|
||||
davinci::fVector4& color);
|
||||
|
||||
virtual void end();
|
||||
virtual bool begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material, const davinci::VertexDesc& veretexDesc) override;
|
||||
virtual void process(const float32_t* pixelData, davinci::fVector4& color) override;
|
||||
virtual void end() override;
|
||||
|
||||
private:
|
||||
const davinci::RenderPipe* m_pipe = nullptr;
|
||||
|
||||
@@ -89,13 +89,13 @@ void StandardVertexShader::process(size_t index, float32_t* outputVertex)
|
||||
//output NDC position
|
||||
{
|
||||
davinci::fVector3 vertexNDCPos = mat_camera_view_proj * vertexWorldPos;
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_POSITION_NDC)->offset, &vertexNDCPos, sizeof(davinci::fVector3));
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElementByType(davinci::VET_POSITION_NDC)->offset, &vertexNDCPos, sizeof(davinci::fVector3));
|
||||
}
|
||||
|
||||
//output world position
|
||||
if (m_withWorldPos)
|
||||
{
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_POSITION_WORLD)->offset, &vertexWorldPos, sizeof(davinci::fVector3));
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElementByType(davinci::VET_POSITION_WORLD)->offset, &vertexWorldPos, sizeof(davinci::fVector3));
|
||||
}
|
||||
|
||||
//output normal
|
||||
@@ -107,13 +107,13 @@ void StandardVertexShader::process(size_t index, float32_t* outputVertex)
|
||||
matNormal = *p_mat_normal;
|
||||
}
|
||||
davinci::fVector3 v_normal = (matNormal * davinci::fVector4(a_normal, 0)).xyz().normalise();
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_NORMAL)->offset, &v_normal, sizeof(davinci::fVector3));
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElementByType(davinci::VET_NORMAL)->offset, &v_normal, sizeof(davinci::fVector3));
|
||||
}
|
||||
|
||||
//output uv0
|
||||
if (m_withTexCoord0)
|
||||
{
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_TEXCOORD_0)->offset, &a_uv, sizeof(float32_t) * 2);
|
||||
memcpy((char*)outputVertex + m_outputVertexDesc.getElementByType(davinci::VET_TEXCOORD_0)->offset, &a_uv, sizeof(float32_t) * 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user