diff --git a/source/console/dv_console_main.cpp b/source/console/dv_console_main.cpp index 9332424..25eeb90 100644 --- a/source/console/dv_console_main.cpp +++ b/source/console/dv_console_main.cpp @@ -29,6 +29,7 @@ davinci::Scene g_scene; int32_t g_mousePosX = 0; int32_t g_mousePosY = 0; davinci::fVector4 g_mouseColor = davinci::fVector4::BLACK; +int32_t g_debugMaterialID = 0; //------------------------------------------------------------------------------------- //int main(int argc, char* argv[]) diff --git a/source/console/ui/ui_main.cpp b/source/console/ui/ui_main.cpp index 16c7b4e..e779595 100644 --- a/source/console/ui/ui_main.cpp +++ b/source/console/ui/ui_main.cpp @@ -17,7 +17,8 @@ #include "scene/dvc_scene_node.h" #include "scene/component/dvc_light_component.h" #include "../adapter/adapter_texture.h" - +#include "standard/dvu_standard_material.h" +#include "asset/dvc_material.h" SDL_Window* main_window; @@ -28,6 +29,10 @@ extern davinci::AntiAliasingTech g_aaTech; extern int32_t g_mousePosX; extern int32_t g_mousePosY; extern davinci::fVector4 g_mouseColor; +extern int32_t g_debugMaterialID; + +typedef std::map DebugMaterialMap; +DebugMaterialMap g_debugMaterialMap; bool initMainUI(SDL_Window* window, SDL_GLContext gl_context, const char* glsl_version) { @@ -107,8 +112,19 @@ void drawMainUI() { davinci_utils::export_mesh_to_obj(g_device, g_scene); } - const char* aaItem[] = { "None", "MSAA_2X2", "MSAA_4X4"}; + const char* aaItem[] = { "none", "MSAA_2X2", "MSAA_4X4"}; ImGui::Combo("AntiAliasing", (int*)(&g_aaTech), aaItem, IM_ARRAYSIZE(aaItem)); + + const char* materialItems[] = { + "none", + "debug:solid_color", + "debug:base_color_texture", + "debug:normal_texture", + "debug:texture_coordinates_0", + "debug:geometry_normal" + }; + ImGui::Combo("DebugMaterial", (int*)(&g_debugMaterialID), materialItems, IM_ARRAYSIZE(materialItems)); + if (ImGui::Button("Render")) { davinci::RenderPipe pipe(g_device); @@ -125,12 +141,36 @@ void drawMainUI() pipe.setAntiAliasingTech(g_aaTech); + if (g_debugMaterialID == 0) { + pipe.setDebugMaterial(nullptr); + } + else + { + DebugMaterialMap::iterator it = g_debugMaterialMap.find(materialItems[g_debugMaterialID]); + if(it==g_debugMaterialMap.end()) + { + davinci::MaterialPtr debugMaterial = davinci_utils::create_standard_material(&g_device, materialItems[g_debugMaterialID]); + if (debugMaterial) + { + debugMaterial->setupMaterial(); + + g_debugMaterialMap[materialItems[g_debugMaterialID]] = debugMaterial; + pipe.setDebugMaterial(debugMaterial); + } + } + else + { + pipe.setDebugMaterial(it->second); + } + } + + g_scene.buildRenderableQueue(pipe); g_renderTarget.clear(); pipe.process(g_renderTarget); - davinci_utils::dump_render_target("d:\\rendertarget", g_renderTarget); + //davinci_utils::dump_render_target("d:\\rendertarget", g_renderTarget); } ImGui::Separator(); ImVec2 mousePos = ImGui::GetMousePos(); diff --git a/source/core/include/asset/dvc_material.h b/source/core/include/asset/dvc_material.h index c7d8c49..8cd5b2b 100644 --- a/source/core/include/asset/dvc_material.h +++ b/source/core/include/asset/dvc_material.h @@ -2,63 +2,79 @@ #include "dvc_config.h" #include "dvc_pre_declare.h" +#include "math/dvc_vector2.h" +#include "math/dvc_vector3.h" #include "math/dvc_vector4.h" #include "math/dvc_matrix3.h" +#include "math/dvc_matrix4.h" +#include "dvc_texture.h" DV_CORE_BEGIN_NAMESPACE class DV_CORE_API Material { public: - struct TextureInfo + typedef std::variant Value; + + struct Param { - TextureConstPtr texture; - int32_t texCoord = 0; - fMatrix3 uvTransform; + enum ParamType + { + PF_Int32, + PT_Float, + PT_Float2, + PT_Float3, + PT_Float4, + PT_Matrix3, + PT_Matrix4, + PT_Texture, + }; + std::string name; + ParamType type; + Value value; + + Param() = delete; + Param(int32_t v) : type(PF_Int32), value(v) { } + Param(float32_t v) : type(PT_Float), value(v) { } + Param(const fVector2& v) : type(PT_Float2), value(v) {} + Param(const fVector3& v) : type(PT_Float3), value(v) {} + Param(const fVector4& v) : type(PT_Float4), value(v) {} + Param(const fMatrix3& v) : type(PT_Matrix3), value(v) {} + Param(const fMatrix4& v) : type(PT_Matrix4), value(v) {} + Param(const TextureInfo& v) : type(PT_Texture), value(v) {} }; + typedef std::map ParamMap; + +public: + template + bool setParam(const char* name, const T& value) + { + ParamMap::iterator it = m_params.find(name); + if(it==m_params.end() || (!std::holds_alternative(it->second.value))) + { + return false; + } + + it->second.value = value; + return true; + } + + template + bool getParam(const char* name, T& value) const + { + ParamMap::const_iterator it = m_params.find(name); + if(it==m_params.end() || (!std::holds_alternative(it->second.value))) + { + return false; + } + + value = std::get(it->second.value); + return true; + } public: int32_t getID(void) const { return m_id; } - void setBaseColorTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - const fVector4& baseColorfactor); - const TextureInfo& getBaseColorTexture() const { - return m_baseColorTexture; - } - - const fVector4& getBaseColorFactor() const { - return m_baseColorFactor; - } - - void setMetallicRoughnessTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - float32_t metallicFactor = 1, float32_t roughnessFactor = 1); - - const TextureInfo& getMetallicRoughnessTexture() const { - return m_metallicRoughnessTexture; - } - - float32_t getMetallicFactor() const { - return m_metallicFactor; - } - - float32_t getRoughnessFactor() const { - return m_roughnessFactor; - } - - void setNormalTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - float32_t scale = 1); - - const TextureInfo& getNormalTexture() const { - return m_normalTexture; - } - - float32_t getNormalScale() const { - return m_normalScale; - } - - void setVertexShader(const char* szShaderFile, const char* vertexShaderName); - void setFragementShader(const char* szShaderFile, const char* fragementShaderName); - VertexShaderInterface* getVertexShader() const { return m_vertexShader; } @@ -67,37 +83,26 @@ public: return m_pixelShader; } + virtual bool setupMaterial(); + virtual bool pickupParam(const davinci::MaterialConstPtr otherMaterial) { + return true; + } -public: - bool loadShader(); +protected: + void setVertexShader(const char* szShaderFile, const char* vertexShaderName); + void setFragementShader(const char* szShaderFile, const char* fragementShaderName); + + template + bool registerParam(const char* name, const T& defaultValue) { + if (m_params.find(name) != m_params.end()) return false; + m_params.insert(std::make_pair(name, Param(defaultValue))); + return true; + } protected: int32_t m_id; + std::string m_name; - /*The base color texture. - * The first three components (RGB) MUST be encoded with the sRGB transfer function. - */ - TextureInfo m_baseColorTexture; - fVector4 m_baseColorFactor = fVector4::ONE; - - /*The metallic - roughness texture. - * The metalness values are sampled from the B channel. - * The roughness values are sampled from the G channel. - */ - TextureInfo m_metallicRoughnessTexture; - float32_t m_metallicFactor = 1.0f; - float32_t m_roughnessFactor = 1.0f; - - /*The normal texture. - */ - TextureInfo m_normalTexture; - /*The scalar parameter applied to each normal vector of the texture. - * This value scales the normal vector in X and Y directions using the formula: - * scaledNormal = (normalize * 2.0 - 1.0) * vec3(, , 1.0). - */ - float32_t m_normalScale = 1.0f; - -protected: VertexShaderInterface* m_vertexShader = nullptr; PixelShaderInterface* m_pixelShader = nullptr; @@ -107,8 +112,9 @@ protected: std::string m_fragementShaderFile; std::string m_fragementShaderName; + ParamMap m_params; public: - Material(int32_t id); + Material(int32_t id, const char* name); ~Material(); }; diff --git a/source/core/include/asset/dvc_texture.h b/source/core/include/asset/dvc_texture.h index 66752df..b0b2016 100644 --- a/source/core/include/asset/dvc_texture.h +++ b/source/core/include/asset/dvc_texture.h @@ -26,4 +26,12 @@ public: Texture(int32_t id); ~Texture(); }; + +struct TextureInfo +{ + TextureConstPtr texture; + int32_t texCoord = 0; + fMatrix3 uvTransform; +}; + DV_CORE_END_NAMESPACE diff --git a/source/core/include/device/dvc_device.h b/source/core/include/device/dvc_device.h index acd908a..acddc32 100644 --- a/source/core/include/device/dvc_device.h +++ b/source/core/include/device/dvc_device.h @@ -30,7 +30,13 @@ public: TexturePtr newTextureAsset(); TexturePtr getTexture(int32_t id) const; - MaterialPtr newMaterialAsset(); + template + MaterialPtr newMaterialAsset(const char* name) { + MaterialPtr materialPtr = std::make_shared(nextID(), name); + m_materialAssetMap.insert(std::make_pair(materialPtr->getID(), materialPtr)); + return materialPtr; + } + MaterialPtr getMaterial(int32_t id) const; private: diff --git a/source/core/include/dvc_config.h b/source/core/include/dvc_config.h index f68921a..f7d8fa8 100644 --- a/source/core/include/dvc_config.h +++ b/source/core/include/dvc_config.h @@ -46,7 +46,8 @@ enum VertexElementType { VET_UNKNOWN, - VET_POSITION, + VET_POSITION_MODEL, VET_POSITION_WORLD, VET_POSITION_VIEW, VET_POSITION_NDC, + VET_NORMAL, VET_TANGENT, VET_BINORMAL, diff --git a/source/core/include/pipe/dvc_render_pipe.h b/source/core/include/pipe/dvc_render_pipe.h index 88d8c3c..7e803f6 100644 --- a/source/core/include/pipe/dvc_render_pipe.h +++ b/source/core/include/pipe/dvc_render_pipe.h @@ -17,18 +17,28 @@ public: const Device& getDevice() const { return m_device; } + UniformBuffer& getUniformBuffer() { return m_uniformBuffer; } const UniformBuffer& getUniformBuffer() const { return m_uniformBuffer; } + AntiAliasingTech getAntiAliasingTech() const { return m_aaTech; } void setAntiAliasingTech(AntiAliasingTech aaTech) { m_aaTech = aaTech; } + + MaterialPtr getDebugMaterial() const { + return m_debugMaterial; + } + void setDebugMaterial(MaterialPtr material) { + m_debugMaterial = material; + } + void pushRenderable(RenderableConstPtr renderable); void process(RenderTarget& renderTarget); @@ -38,6 +48,7 @@ protected: AntiAliasingTech m_aaTech = AntiAliasingTech::AA_None; UniformBuffer m_uniformBuffer; RenderableArray m_renderableQueue; + MaterialPtr m_debugMaterial; public: RenderPipe(Device& device); diff --git a/source/core/include/shader/dvc_shader_functions.h b/source/core/include/shader/dvc_shader_functions.h index 5c2bc8c..5f5b0f6 100644 --- a/source/core/include/shader/dvc_shader_functions.h +++ b/source/core/include/shader/dvc_shader_functions.h @@ -31,7 +31,7 @@ public: return (a < b) ? a : b; } - static DV_CORE_API fVector4 texture2D(const RenderPipe& pipe, const Material::TextureInfo& texturePtr, const fVector2& uv, const fVector4& defaultValue); + static DV_CORE_API fVector4 texture2D(const RenderPipe& pipe, const TextureInfo& texturePtr, const fVector2& uv, const fVector4& defaultValue); }; DV_CORE_END_NAMESPACE diff --git a/source/core/include/shader/dvc_shader_interface.h b/source/core/include/shader/dvc_shader_interface.h index 90ac5c1..cc31c07 100644 --- a/source/core/include/shader/dvc_shader_interface.h +++ b/source/core/include/shader/dvc_shader_interface.h @@ -16,9 +16,11 @@ public: virtual const VertexDesc& getOutputVertexDesc() const = 0; typedef std::function SetInputAttributeFunc; - virtual void prepare(const RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) = 0; + virtual void begin(const RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) = 0; - virtual void process(size_t index, void* outputVertex, fVector3& vertexWorldPos) = 0; + virtual void process(size_t index, float32_t* outputVertex) = 0; + + virtual void end() = 0; }; class PixelShaderInterface @@ -26,9 +28,11 @@ class PixelShaderInterface public: virtual const char* getName(void) const = 0; - virtual void prepare(const RenderPipe* pipe, MaterialConstPtr material) = 0; + virtual void begin(const RenderPipe* pipe, MaterialConstPtr material) = 0; virtual void process(const VertexDesc& veretexDesc, const float32_t* pixelData, fVector4& color) = 0; + + virtual void end() = 0; }; class ShaderFileInterface diff --git a/source/core/source/asset/dvc_material.cpp b/source/core/source/asset/dvc_material.cpp index 7e29f54..14353f8 100644 --- a/source/core/source/asset/dvc_material.cpp +++ b/source/core/source/asset/dvc_material.cpp @@ -3,8 +3,9 @@ DV_CORE_BEGIN_NAMESPACE -Material::Material(int32_t id) +Material::Material(int32_t id, const char* name) : m_id(id) + , m_name(name) { } @@ -12,37 +13,6 @@ Material::~Material() { } -void Material::setBaseColorTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - const fVector4& baseColorfactor) -{ - m_baseColorTexture.texture = texture; - m_baseColorTexture.texCoord = texCoord; - m_baseColorTexture.uvTransform = uvTransform; - - m_baseColorFactor = baseColorfactor; -} - -void Material::setMetallicRoughnessTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - float32_t metallicFactor, float32_t roughnessFactor) -{ - m_metallicRoughnessTexture.texture = texture; - m_metallicRoughnessTexture.texCoord = texCoord; - m_metallicRoughnessTexture.uvTransform = uvTransform; - - m_metallicFactor = metallicFactor; - m_roughnessFactor = roughnessFactor; -} - -void Material::setNormalTexture(const TextureConstPtr& texture, int32_t texCoord, const fMatrix3& uvTransform, - float32_t scale) -{ - m_normalTexture.texture = texture; - m_normalTexture.texCoord = texCoord; - m_normalTexture.uvTransform = uvTransform; - - m_normalScale = scale; -} - void Material::setVertexShader(const char* szShaderFile, const char* vertexShaderName) { m_vertexshaderFile = szShaderFile; @@ -55,7 +25,7 @@ void Material::setFragementShader(const char* szShaderFile, const char* fragemen m_fragementShaderName = fragementShaderName; } -bool Material::loadShader() +bool Material::setupMaterial() { ShaderFileInterface* shaderInterface = davinci::LoadShaderFile(m_vertexshaderFile.c_str()); if (shaderInterface == nullptr) diff --git a/source/core/source/device/dvc_device.cpp b/source/core/source/device/dvc_device.cpp index 0ac5c85..32f6a29 100644 --- a/source/core/source/device/dvc_device.cpp +++ b/source/core/source/device/dvc_device.cpp @@ -135,13 +135,6 @@ TexturePtr Device::getTexture(int32_t id) const return it->second; } -MaterialPtr Device::newMaterialAsset() -{ - MaterialPtr materialPtr = std::make_shared(nextID()); - m_materialAssetMap.insert(std::make_pair(materialPtr->getID(), materialPtr)); - return materialPtr; -} - MaterialPtr Device::getMaterial(int32_t id) const { std::map::const_iterator it = m_materialAssetMap.find(id); diff --git a/source/core/source/pipe/dvc_render_step1_vertex_shader.cpp b/source/core/source/pipe/dvc_render_step1_vertex_shader.cpp index 4b1ab0b..ec5b449 100644 --- a/source/core/source/pipe/dvc_render_step1_vertex_shader.cpp +++ b/source/core/source/pipe/dvc_render_step1_vertex_shader.cpp @@ -28,8 +28,8 @@ void VertexShaderStep::process(RenderPipe& pipe, const InputAssemberStep::NodeAr fMatrix4 worldInverseTrans = inputNode.transform.inverse().transpose(); uniformBuffer.setAttribute("self:world_transform_inverse_trans", worldInverseTrans); - VertexShaderInterface* vs = inputNode.material->getVertexShader(); - vs->prepare(&pipe, + VertexShaderInterface* vs = pipe.getDebugMaterial() ? pipe.getDebugMaterial()->getVertexShader(): inputNode.material->getVertexShader(); + vs->begin(&pipe, [inputNode](VertexElementType type) -> DeviceBufferAccessorConstPtr { InputAssemberStep::PrimitiveAttributes::const_iterator it = inputNode.vertexData.find(type); @@ -42,12 +42,13 @@ void VertexShaderStep::process(RenderPipe& pipe, const InputAssemberStep::NodeAr ); size_t vertexCounts = inputNode.indices->getCount(); + size_t outputVertexByteSize = vs->getOutputVertexDesc().vertexByteSize(); Node outputNode; outputNode.material = inputNode.material; outputNode.vertexCounts = vertexCounts; outputNode.vertexDesc = vs->getOutputVertexDesc(); - outputNode.vertexBuf = device.newDeviceBuffer(outputNode.vertexDesc.vertexByteSize() * vertexCounts); + outputNode.vertexBuf = device.newDeviceBuffer(outputVertexByteSize * vertexCounts); outputNode.depth.resize(vertexCounts); outputNode.invZ.resize(vertexCounts); @@ -55,22 +56,25 @@ void VertexShaderStep::process(RenderPipe& pipe, const InputAssemberStep::NodeAr { uint16_t index = *((const uint16_t*)(inputNode.indices->getElement(i))); - fVector3 vertexWorldPos; - void* outputVertexMemory = outputNode.vertexBuf->ptr(i* outputNode.vertexDesc.vertexByteSize()); - vs->process(index, outputVertexMemory, vertexWorldPos); + uint8_t* outputVertexMemory = (uint8_t*)(outputNode.vertexBuf->ptr(i * outputVertexByteSize)); + vs->process(index, (float32_t*)outputVertexMemory); //TODO: clip //TODO: div-zero - fVector3 cameraSpacePos = (*cameraView) * vertexWorldPos; - outputNode.depth[i] = (std::fabsf(cameraSpacePos.z) - cameraNear) / (cameraFar - cameraNear); - float32_t cameraSpaceZ = cameraSpacePos.z; - outputNode.invZ[i] = 1.f/std::fabsf(cameraSpacePos.z); + size_t ndcPosOffset = outputNode.vertexDesc.getElement(VET_POSITION_NDC)->offset; + const fVector3* vertexNDCPos = (const fVector3*)(outputVertexMemory+ndcPosOffset); + + outputNode.depth[i] = (std::fabsf(vertexNDCPos->z) - cameraNear) / (cameraFar - cameraNear); + float32_t cameraSpaceZ = vertexNDCPos->z; + outputNode.invZ[i] = 1.f/std::fabsf(vertexNDCPos->z); } m_nodes.push_back(outputNode); + + vs->end(); } } diff --git a/source/core/source/pipe/dvc_render_step2_rasterizer.cpp b/source/core/source/pipe/dvc_render_step2_rasterizer.cpp index dab19f3..b93bbb6 100644 --- a/source/core/source/pipe/dvc_render_step2_rasterizer.cpp +++ b/source/core/source/pipe/dvc_render_step2_rasterizer.cpp @@ -10,8 +10,6 @@ DV_CORE_BEGIN_NAMESPACE void RasterizerStep::process(RenderPipe& pipe, const VertexShaderStep::NodeArray& vsNodeArray, AntiAliasingTech aaTech, int32_t canvasWidth, int32_t canvasHeight) { - //ShaderFileInterface* shaderInterface = davinci::LoadShaderFile("TestShader.dll"); - //PixelShaderInterface* pixelShader = shaderInterface->getPixelShader("test"); Device& device = pipe.getDevice(); UniformBuffer& uniformBuffer = pipe.getUniformBuffer(); @@ -21,16 +19,22 @@ void RasterizerStep::process(RenderPipe& pipe, const VertexShaderStep::NodeArray m_startOffsetArray.resize(canvasWidth* canvasHeight, -1); + MaterialPtr debugMaterial = pipe.getDebugMaterial(); + VertexShaderStep::NodeArray::const_iterator it, end = vsNodeArray.end(); for (it = vsNodeArray.begin(); it != end; ++it) { const VertexShaderStep::Node& node = *it; - PixelShaderInterface* pixelShader = node.material->getPixelShader(); - pixelShader->prepare(&pipe, node.material); + if (debugMaterial) + { + debugMaterial->pickupParam(node.material); + } + PixelShaderInterface* pixelShader = debugMaterial ? debugMaterial->getPixelShader() : node.material->getPixelShader(); + pixelShader->begin(&pipe, debugMaterial ?debugMaterial : node.material); size_t vertexSize = node.vertexDesc.vertexByteSize(); - size_t POS_offset = node.vertexDesc.getElement(VET_POSITION)->offset; + size_t POS_offset = node.vertexDesc.getElement(VET_POSITION_NDC)->offset; for (size_t i = 0; i < node.vertexCounts; i += 3) { @@ -65,10 +69,10 @@ void RasterizerStep::process(RenderPipe& pipe, const VertexShaderStep::NodeArray pixelData[j] = MathUtil::lerp3(vertex0[j], vertex1[j], vertex2[j], percentCorrected); } - if(dot.first==570 && dot.second==405 ) - { - int a = 0; - } + //if(dot.first==570 && dot.second==405 ) + //{ + // int a = 0; + //} fVector4 color; pixelShader->process(node.vertexDesc, &(pixelData[0]), color); diff --git a/source/core/source/shader/dvc_shader_functions.cpp b/source/core/source/shader/dvc_shader_functions.cpp index b17de00..3138df2 100644 --- a/source/core/source/shader/dvc_shader_functions.cpp +++ b/source/core/source/shader/dvc_shader_functions.cpp @@ -4,7 +4,7 @@ DV_CORE_BEGIN_NAMESPACE -fVector4 shader::texture2D(const RenderPipe& pipe, const Material::TextureInfo& textureInfo, const fVector2& uv, const fVector4& defaultValue) +fVector4 shader::texture2D(const RenderPipe& pipe, const TextureInfo& textureInfo, const fVector2& uv, const fVector4& defaultValue) { if (!(textureInfo.texture)) return defaultValue; fVector3 uvTransform = textureInfo.uvTransform * fVector3(uv, 1); diff --git a/source/dv_config.h.in b/source/dv_config.h.in index 449c208..c0ef551 100644 --- a/source/dv_config.h.in +++ b/source/dv_config.h.in @@ -37,6 +37,7 @@ #include #include #include +#include #ifdef DV_SYS_WINDOWS #define snprintf _snprintf diff --git a/source/shaders/standard/CMakeLists.txt b/source/shaders/standard/CMakeLists.txt index 7c48174..3b5de7d 100644 --- a/source/shaders/standard/CMakeLists.txt +++ b/source/shaders/standard/CMakeLists.txt @@ -1,17 +1,19 @@ add_library(dv_standard_shaders SHARED dll_main.cpp vs_standard.h - vs_standard.inc + vs_standard.cpp fs_debug_solid_color.h fs_debug_solid_color.cpp - fs_debug_base_color.h - fs_debug_base_color.cpp - fs_debug_normal_texture.h - fs_debug_normal_texture.cpp + fs_debug_show_texture.h + fs_debug_show_texture.cpp fs_debug_texture_coordinates.h fs_debug_texture_coordinates.cpp fs_debug_geometry_normal.h fs_debug_geometry_normal.cpp + fs_classic_phong.h + fs_classic_phong.cpp + fs_pbr_gltf.h + fs_pbr_gltf.cpp ) add_definitions(-DDV_SHADER_EXPORTS) diff --git a/source/shaders/standard/dll_main.cpp b/source/shaders/standard/dll_main.cpp index 3d00317..cf5ef0c 100644 --- a/source/shaders/standard/dll_main.cpp +++ b/source/shaders/standard/dll_main.cpp @@ -3,10 +3,11 @@ #include "vs_standard.h" #include "fs_debug_solid_color.h" -#include "fs_debug_base_color.h" -#include "fs_debug_normal_texture.h" +#include "fs_debug_show_texture.h" #include "fs_debug_texture_coordinates.h" #include "fs_debug_geometry_normal.h" +#include "fs_classic_phong.h" +#include "fs_pbr_gltf.h" class StandardShaderInterface : public davinci::ShaderFileInterface { @@ -28,16 +29,21 @@ public: public: StandardShaderInterface() { - registerVertexShader(new StandardVertexShader()); - registerVertexShader(new StandardVertexShader()); - registerVertexShader(new StandardVertexShader()); - registerVertexShader(new StandardVertexShader()); + registerVertexShader(new StandardVertexShader(false , false , false)); + registerVertexShader(new StandardVertexShader(false , false , true)); + registerVertexShader(new StandardVertexShader(false , true , false)); + registerVertexShader(new StandardVertexShader(false , true , true)); + registerVertexShader(new StandardVertexShader(true , false , false)); + registerVertexShader(new StandardVertexShader(true , false , true)); + registerVertexShader(new StandardVertexShader(true , true , false)); + registerVertexShader(new StandardVertexShader(true , true , true)); registerFragementShader(new DebugFragementShader_SolidColor()); - registerFragementShader(new DebugFragementShader_BaseColor()); - registerFragementShader(new DebugFragementShader_NormalTexture()); + registerFragementShader(new DebugFragementShader_ShowTexture()); registerFragementShader(new DebugFragementShader_TextureCoordinates()); registerFragementShader(new DebugFragementShader_GeometryNormal()); + registerFragementShader(new ClassicFragementShader_Phong()); + registerFragementShader(new PbrFragementShader_GLTF()); } ~StandardShaderInterface() diff --git a/source/shaders/standard/fs_classic_phong.cpp b/source/shaders/standard/fs_classic_phong.cpp new file mode 100644 index 0000000..f59dabc --- /dev/null +++ b/source/shaders/standard/fs_classic_phong.cpp @@ -0,0 +1,77 @@ +#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"; +} + +void ClassicFragementShader_Phong::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +{ + 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"))) + { + m_ambientLightColor = *p_ambient_light_color; + } + if (davinci::fVector3* p_light0_position = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:position"))) + { + m_light0Position = *p_light0_position; + } + if (davinci::fVector3* p_light0_color = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:color"))) + { + m_light0Color = *p_light0_color; + } + + if (davinci::fVector3* p_camera_position = (davinci::fVector3*)(uniformBuffer.getAttribute("camera:eye_pos"))) + { + m_cameraPosition = *p_camera_position; + } +} + +void ClassicFragementShader_Phong::process(const davinci::VertexDesc& veretexDesc, 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 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() +{ +} + diff --git a/source/shaders/standard/fs_classic_phong.h b/source/shaders/standard/fs_classic_phong.h new file mode 100644 index 0000000..4633054 --- /dev/null +++ b/source/shaders/standard/fs_classic_phong.h @@ -0,0 +1,27 @@ +#pragma once + +#include "dvc_config.h" +#include "shader/dvc_shader_interface.h" + +class ClassicFragementShader_Phong : public davinci::PixelShaderInterface +{ +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(); +private: + const davinci::RenderPipe* m_pipe = nullptr; + davinci::fVector4 m_materialColor = davinci::fVector4::WHITE; + float32_t m_specularShininess = 64.0f; + 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_cameraPosition = davinci::fVector3::ZERO; +}; diff --git a/source/shaders/standard/fs_debug_base_color.cpp b/source/shaders/standard/fs_debug_base_color.cpp deleted file mode 100644 index 62504d8..0000000 --- a/source/shaders/standard/fs_debug_base_color.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "fs_debug_base_color.h" -#include "device/dvc_device.h" -#include "device/dvc_uniform_buffer.h" -#include "asset/dvc_texture.h" -#include "shader/dvc_shader_functions.h" -#include "pipe/dvc_render_pipe.h" - -const char* DebugFragementShader_BaseColor::getName(void) const -{ - return "debug:base_color"; -} - -void DebugFragementShader_BaseColor::prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) -{ - m_pipe = pipe; - m_material = material; -} - -void DebugFragementShader_BaseColor::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) -{ - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - 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 u_baseColor = davinci::shader::texture2D(*m_pipe, m_material->getBaseColorTexture(), (*v_uv), davinci::fVector4::WHITE); - - color = davinci::fVector4(u_baseColor.xyz(), 1); -} diff --git a/source/shaders/standard/fs_debug_geometry_normal.cpp b/source/shaders/standard/fs_debug_geometry_normal.cpp index 386d5af..57bfe90 100644 --- a/source/shaders/standard/fs_debug_geometry_normal.cpp +++ b/source/shaders/standard/fs_debug_geometry_normal.cpp @@ -10,7 +10,7 @@ const char* DebugFragementShader_GeometryNormal::getName(void) const return "debug:geometry_normal"; } -void DebugFragementShader_GeometryNormal::prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +void DebugFragementShader_GeometryNormal::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) { m_pipe = pipe; m_material = material; @@ -26,5 +26,10 @@ void DebugFragementShader_GeometryNormal::process(const davinci::VertexDesc& ver davinci::fVector3 normalColor = *v_normal; normalColor.normalise(); + normalColor = normalColor * 0.5f + 0.5f; color = davinci::fVector4(normalColor, 1); } + +void DebugFragementShader_GeometryNormal::end() +{ +} diff --git a/source/shaders/standard/fs_debug_geometry_normal.h b/source/shaders/standard/fs_debug_geometry_normal.h index c12777c..c1daea4 100644 --- a/source/shaders/standard/fs_debug_geometry_normal.h +++ b/source/shaders/standard/fs_debug_geometry_normal.h @@ -8,11 +8,13 @@ class DebugFragementShader_GeometryNormal : public davinci::PixelShaderInterface public: virtual const char* getName(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); + 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(); + private: const davinci::RenderPipe* m_pipe = nullptr; davinci::MaterialConstPtr m_material; diff --git a/source/shaders/standard/fs_debug_normal_texture.cpp b/source/shaders/standard/fs_debug_normal_texture.cpp deleted file mode 100644 index 23caa46..0000000 --- a/source/shaders/standard/fs_debug_normal_texture.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "fs_debug_normal_texture.h" -#include "device/dvc_device.h" -#include "device/dvc_uniform_buffer.h" -#include "asset/dvc_texture.h" -#include "shader/dvc_shader_functions.h" -#include "pipe/dvc_render_pipe.h" - -const char* DebugFragementShader_NormalTexture::getName(void) const -{ - return "debug:normal_texture"; -} - -void DebugFragementShader_NormalTexture::prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) -{ - m_pipe = pipe; - m_material = material; -} - -void DebugFragementShader_NormalTexture::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) -{ - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - 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 u_baseColor = davinci::shader::texture2D(*m_pipe, m_material->getNormalTexture(), (*v_uv), davinci::fVector4::WHITE); - - color = davinci::fVector4(u_baseColor.xyz(), 1); -} diff --git a/source/shaders/standard/fs_debug_show_texture.cpp b/source/shaders/standard/fs_debug_show_texture.cpp new file mode 100644 index 0000000..4e39b95 --- /dev/null +++ b/source/shaders/standard/fs_debug_show_texture.cpp @@ -0,0 +1,37 @@ +#include "fs_debug_show_texture.h" +#include "device/dvc_device.h" +#include "device/dvc_uniform_buffer.h" +#include "asset/dvc_texture.h" +#include "shader/dvc_shader_functions.h" +#include "pipe/dvc_render_pipe.h" + +const char* DebugFragementShader_ShowTexture::getName(void) const +{ + return "debug:show_texture"; +} + +void DebugFragementShader_ShowTexture::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +{ + m_pipe = pipe; + m_material = material; + + material->getParam("u_textureInfo", m_textureInfo); +} + +void DebugFragementShader_ShowTexture::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) +{ + const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); + + 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); + + color = textureColor; +} +void DebugFragementShader_ShowTexture::end() +{ + m_material.reset(); + m_textureInfo.texture.reset(); +} diff --git a/source/shaders/standard/fs_debug_normal_texture.h b/source/shaders/standard/fs_debug_show_texture.h similarity index 57% rename from source/shaders/standard/fs_debug_normal_texture.h rename to source/shaders/standard/fs_debug_show_texture.h index b75c106..3d40d8d 100644 --- a/source/shaders/standard/fs_debug_normal_texture.h +++ b/source/shaders/standard/fs_debug_show_texture.h @@ -2,18 +2,23 @@ #include "dvc_config.h" #include "shader/dvc_shader_interface.h" +#include "asset/dvc_material.h" -class DebugFragementShader_NormalTexture : public davinci::PixelShaderInterface +class DebugFragementShader_ShowTexture : public davinci::PixelShaderInterface { public: virtual const char* getName(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); + 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(); + private: const davinci::RenderPipe* m_pipe = nullptr; davinci::MaterialConstPtr m_material; + + davinci::TextureInfo m_textureInfo; }; diff --git a/source/shaders/standard/fs_debug_solid_color.cpp b/source/shaders/standard/fs_debug_solid_color.cpp index 87b4bd9..7c14c65 100644 --- a/source/shaders/standard/fs_debug_solid_color.cpp +++ b/source/shaders/standard/fs_debug_solid_color.cpp @@ -1,16 +1,21 @@ #include "fs_debug_solid_color.h" +#include "asset/dvc_material.h" const char* DebugFragementShader_SolidColor::getName(void) const { return "debug:solid_color"; } -void DebugFragementShader_SolidColor::prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +void DebugFragementShader_SolidColor::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) { - + material->getParam("u_solidColor", m_solidColor); } -void DebugFragementShader_SolidColor::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) +void DebugFragementShader_SolidColor::process( const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) +{ + color = m_solidColor; +} + +void DebugFragementShader_SolidColor::end() { - color = davinci::fVector4::RED; } diff --git a/source/shaders/standard/fs_debug_solid_color.h b/source/shaders/standard/fs_debug_solid_color.h index b27dd58..18c00cd 100644 --- a/source/shaders/standard/fs_debug_solid_color.h +++ b/source/shaders/standard/fs_debug_solid_color.h @@ -8,8 +8,13 @@ class DebugFragementShader_SolidColor : public davinci::PixelShaderInterface public: virtual const char* getName(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); + 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(); + +private: + davinci::fVector4 m_solidColor = davinci::fVector4::WHITE; }; diff --git a/source/shaders/standard/fs_debug_texture_coordinates.cpp b/source/shaders/standard/fs_debug_texture_coordinates.cpp index c160451..2be62ea 100644 --- a/source/shaders/standard/fs_debug_texture_coordinates.cpp +++ b/source/shaders/standard/fs_debug_texture_coordinates.cpp @@ -10,10 +10,12 @@ const char* DebugFragementShader_TextureCoordinates::getName(void) const return "debug:texture_coordinates"; } -void DebugFragementShader_TextureCoordinates::prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +void DebugFragementShader_TextureCoordinates::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) { m_pipe = pipe; m_material = material; + + material->getParam("u_texCoord", m_texCoord); } void DebugFragementShader_TextureCoordinates::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) @@ -29,3 +31,7 @@ void DebugFragementShader_TextureCoordinates::process(const davinci::VertexDesc& color = davinci::fVector4(uv_x, uv_y, 0, 1); } + +void DebugFragementShader_TextureCoordinates::end() +{ +} diff --git a/source/shaders/standard/fs_debug_texture_coordinates.h b/source/shaders/standard/fs_debug_texture_coordinates.h index e2433c9..0089471 100644 --- a/source/shaders/standard/fs_debug_texture_coordinates.h +++ b/source/shaders/standard/fs_debug_texture_coordinates.h @@ -8,12 +8,16 @@ class DebugFragementShader_TextureCoordinates : public davinci::PixelShaderInter public: virtual const char* getName(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); + 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(); + private: const davinci::RenderPipe* m_pipe = nullptr; davinci::MaterialConstPtr m_material; + + int32_t m_texCoord=0; }; diff --git a/source/shaders/standard/fs_pbr_gltf.cpp b/source/shaders/standard/fs_pbr_gltf.cpp new file mode 100644 index 0000000..6e32e26 --- /dev/null +++ b/source/shaders/standard/fs_pbr_gltf.cpp @@ -0,0 +1,25 @@ +#include "fs_pbr_gltf.h" +#include "pipe/dvc_render_pipe.h" + +using namespace davinci; + +const char* PbrFragementShader_GLTF::getName(void) const +{ + return "pbr:gltf"; +} + +void PbrFragementShader_GLTF::begin(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material) +{ + m_pipe = pipe; + const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); +} + +void PbrFragementShader_GLTF::process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, davinci::fVector4& color) +{ + color = fVector4::BLUE; +} + +void PbrFragementShader_GLTF::end() +{ +} + diff --git a/source/shaders/standard/fs_debug_base_color.h b/source/shaders/standard/fs_pbr_gltf.h similarity index 65% rename from source/shaders/standard/fs_debug_base_color.h rename to source/shaders/standard/fs_pbr_gltf.h index ad534a4..5436447 100644 --- a/source/shaders/standard/fs_debug_base_color.h +++ b/source/shaders/standard/fs_pbr_gltf.h @@ -3,17 +3,20 @@ #include "dvc_config.h" #include "shader/dvc_shader_interface.h" -class DebugFragementShader_BaseColor : public davinci::PixelShaderInterface +class PbrFragementShader_GLTF : public davinci::PixelShaderInterface { public: virtual const char* getName(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); + 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(); + private: const davinci::RenderPipe* m_pipe = nullptr; davinci::MaterialConstPtr m_material; + }; diff --git a/source/shaders/standard/vs_standard.cpp b/source/shaders/standard/vs_standard.cpp new file mode 100644 index 0000000..9343af7 --- /dev/null +++ b/source/shaders/standard/vs_standard.cpp @@ -0,0 +1,123 @@ +#include "vs_standard.h" +#include "device/dvc_buffer_accessor.h" +#include "math/dvc_vector2.h" +#include "math/dvc_vector3.h" +#include "math/dvc_matrix4.h" +#include "pipe/dvc_render_pipe.h" +#include "device/dvc_uniform_buffer.h" + +StandardVertexShader::StandardVertexShader(bool withWorldPos, bool withNormal, bool withTexCoord0) + : m_withWorldPos(withWorldPos) + , m_withNormal(withNormal) + , m_withTexCoord0(withTexCoord0) +{ + m_name = "standard"; + + m_inputAccessors[davinci::VET_POSITION_MODEL] = nullptr; + m_outputVertexDesc.addElement("v_ndc_pos", davinci::VET_POSITION_NDC, davinci::CT_Float32, davinci::DT_Vec3); + + if (withWorldPos) + { + m_outputVertexDesc.addElement("v_world_pos", davinci::VET_POSITION_WORLD, davinci::CT_Float32, davinci::DT_Vec3); + } + m_name += withWorldPos ? "+worldpos" : "-worldpos"; + + if (withNormal) + { + m_inputAccessors[davinci::VET_NORMAL] = nullptr; + m_outputVertexDesc.addElement("v_normal", davinci::VET_NORMAL, davinci::CT_Float32, davinci::DT_Vec3); + } + m_name += withNormal ? "+normal" : "-normal"; + + if (withTexCoord0) + { + m_inputAccessors[davinci::VET_TEXCOORD_0] = nullptr; + m_outputVertexDesc.addElement("v_uv", davinci::VET_TEXCOORD_0, davinci::CT_Float32, davinci::DT_Vec2); + } + m_name += withTexCoord0 ? "+uv0" : "-uv0"; +} + +StandardVertexShader::~StandardVertexShader() +{ + +} + +void StandardVertexShader::begin(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) +{ + m_pipe = pipe; + + for (auto& pair : m_inputAccessors) + { + pair.second = setInputAttributeFunc(pair.first); + } + + assert(getInputAccessor(davinci::VET_POSITION_MODEL)); + assert((!m_withNormal) || getInputAccessor(davinci::VET_NORMAL)); + assert((!m_withTexCoord0) || getInputAccessor(davinci::VET_TEXCOORD_0)); +} + +void StandardVertexShader::process(size_t index, float32_t* outputVertex) +{ + static const float DEFAULT_POSITION[] = {0.f, 0.f, 0.f}; + static const float32_t DEFAULT_NORMAL[] = { 0.f, 0.f, 0.f }; + static const float32_t DEFAULT_TEXCOORD0[] = { 0.f, 0.f}; + + const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); + + davinci::DeviceBufferAccessorConstPtr inputPosition = getInputAccessor(davinci::VET_POSITION_MODEL); + davinci::DeviceBufferAccessorConstPtr inputNormal = m_withNormal ? getInputAccessor(davinci::VET_NORMAL) : nullptr; + davinci::DeviceBufferAccessorConstPtr inputTexcoord0 = m_withTexCoord0 ? getInputAccessor(davinci::VET_TEXCOORD_0) : nullptr; + + davinci::fVector3 a_position(inputPosition ? (const float32_t*)(inputPosition->getElement(index)) : DEFAULT_POSITION); + davinci::fVector3 a_normal(inputNormal ? (const float32_t*)(inputNormal->getElement(index)) : DEFAULT_NORMAL); + davinci::fVector2 a_uv(inputTexcoord0 ? (const float32_t*)(inputTexcoord0->getElement(index)) : DEFAULT_TEXCOORD0); + + davinci::fMatrix4 mat_world = davinci::fMatrix4::IDENTITY; + if (davinci::fMatrix4* p_mat_world = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform"))) + { + mat_world = *p_mat_world; + } + + davinci::fMatrix4 mat_camera_view_proj = davinci::fMatrix4::IDENTITY; + if (davinci::fMatrix4* p_mat_camera_view_proj = (davinci::fMatrix4*)(uniformBuffer.getAttribute("camera:view_proj_mat"))) + { + mat_camera_view_proj = *p_mat_camera_view_proj; + } + + davinci::fVector3 vertexWorldPos = mat_world * a_position; + + //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)); + } + + //output world position + if (m_withWorldPos) + { + memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_POSITION_WORLD)->offset, &vertexWorldPos, sizeof(davinci::fVector3)); + } + + //output normal + if (m_withNormal) + { + davinci::fMatrix4 matNormal = davinci::fMatrix4::IDENTITY; + if (davinci::fMatrix4* p_mat_normal = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform_inverse_trans"))) + { + 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)); + } + + //output uv0 + if (m_withTexCoord0) + { + memcpy((char*)outputVertex + m_outputVertexDesc.getElement(davinci::VET_TEXCOORD_0)->offset, &a_uv, sizeof(float32_t) * 2); + } +} + +void StandardVertexShader::end() +{ + +} \ No newline at end of file diff --git a/source/shaders/standard/vs_standard.h b/source/shaders/standard/vs_standard.h index 01a4088..b0593fd 100644 --- a/source/shaders/standard/vs_standard.h +++ b/source/shaders/standard/vs_standard.h @@ -4,38 +4,48 @@ #include "shader/dvc_shader_interface.h" -template class StandardVertexShader : public davinci::VertexShaderInterface { public: - virtual const char* getName(void) const; - virtual const davinci::VertexDesc& getOutputVertexDesc() const; - virtual size_t getOutputVertexByteSize(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc); - virtual void process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos); + virtual const char* getName(void) const { + return m_name.c_str(); + } + + virtual const davinci::VertexDesc& getOutputVertexDesc() const { + return m_outputVertexDesc; + } + + virtual size_t getOutputVertexByteSize(void) const { + return m_outputVertexDesc.vertexByteSize(); + } + + virtual void begin(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc); + virtual void process(size_t index, float32_t* outputVertex); + virtual void end(); + +protected: + davinci::DeviceBufferAccessorConstPtr getInputAccessor(davinci::VertexElementType elementType) const { + auto it = m_inputAccessors.find(elementType); + if (it != m_inputAccessors.end()) { + return it->second; + } + return nullptr; + } private: const davinci::RenderPipe* m_pipe = nullptr; + std::string m_name; + + bool m_withWorldPos = false; + bool m_withNormal = false; + bool m_withTexCoord0 = false; + + typedef std::map InputAccessorMap; + InputAccessorMap m_inputAccessors; + davinci::VertexDesc m_outputVertexDesc; - using InputBufferMembers = decltype(std::tuple_cat( - std::tuple(), - std::conditional_t, std::tuple<>>{}, - std::conditional_t, std::tuple<>>{} - )); - InputBufferMembers m_inputAccessors; - - static constexpr int32_t iPOSITION() { return 0; }; - static constexpr int32_t iNORMAL() { return 1; }; - static constexpr int32_t iUV() { return WithNormal+1; }; - - //davinci::DeviceBufferAccessorConstPtr& getPositionAccessor(); - //davinci::DeviceBufferAccessorConstPtr& getNormalAccessor(); - //davinci::DeviceBufferAccessorConstPtr& getUVAccessor(); - public: - StandardVertexShader(); + StandardVertexShader(bool withWorldPos, bool withNormal, bool withTexCoord0); virtual ~StandardVertexShader(); }; - -#include "vs_standard.inc" diff --git a/source/shaders/standard/vs_standard.inc b/source/shaders/standard/vs_standard.inc deleted file mode 100644 index 22454da..0000000 --- a/source/shaders/standard/vs_standard.inc +++ /dev/null @@ -1,181 +0,0 @@ -#include "device/dvc_buffer_accessor.h" -#include "math/dvc_vector2.h" -#include "math/dvc_vector3.h" -#include "math/dvc_matrix4.h" -#include "pipe/dvc_render_pipe.h" -#include "device/dvc_uniform_buffer.h" - -template -StandardVertexShader::StandardVertexShader() -{ - m_outputVertexDesc.addElement("v_position", davinci::VET_POSITION, davinci::CT_Float32, davinci::DT_Vec3); - - if constexpr(WithNormal) - m_outputVertexDesc.addElement("v_normal", davinci::VET_NORMAL, davinci::CT_Float32, davinci::DT_Vec3); - - if constexpr(WithUV) - m_outputVertexDesc.addElement("v_uv", davinci::VET_TEXCOORD_0, davinci::CT_Float32, davinci::DT_Vec2); -} - -template -StandardVertexShader::~StandardVertexShader() -{ - -} - -template -struct CompileTimeString { - std::array data{}; - std::size_t size = 0; - - constexpr void append(const char* str, std::size_t len) { - for (std::size_t i = 0; i < len; ++i) { - data[size++] = str[i]; - } - } - - constexpr void append(const char* str) { - while (*str) { - data[size++] = *str++; - } - } - - constexpr const char* c_str() const { return data.data(); } - constexpr std::string_view view() const { return {data.data(), size}; } -}; - -template -constexpr auto buildNameString() -{ - constexpr const char* prefix = "standard"; - constexpr const char* normalString = WithNormal ? "+normal" : "-normal"; - constexpr const char* uvString = WithUV ? "+uv" : "-uv"; - - constexpr std::size_t total_len = std::char_traits::length(prefix) - + std::char_traits::length(normalString) - + std::char_traits::length(uvString); - - CompileTimeString result; - result.append(prefix); - result.append(normalString); - result.append(uvString); - result.append(""); // null terminator - return result; -} - -template -const char* StandardVertexShader::getName(void) const -{ - static constexpr auto strName = buildNameString(); - const char* p = strName.c_str(); - return p; -} - -template -const davinci::VertexDesc& StandardVertexShader::getOutputVertexDesc() const -{ - return m_outputVertexDesc; -} - -template -size_t StandardVertexShader::getOutputVertexByteSize(void) const -{ - return m_outputVertexDesc.vertexByteSize(); -} - -template -void StandardVertexShader::prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) -{ - m_pipe = pipe; - - std::get(m_inputAccessors) = setInputAttributeFunc(davinci::VET_POSITION); - - if constexpr(WithNormal) - std::get(m_inputAccessors) = setInputAttributeFunc(davinci::VET_NORMAL); - - if constexpr(WithUV) - std::get(m_inputAccessors) = setInputAttributeFunc(davinci::VET_TEXCOORD_0); - -} -/* -template -davinci::DeviceBufferAccessorConstPtr& StandardVertexShader::getPositionAccessor() -{ - return std::get<0>(m_inputAccessors); -} - -template -davinci::DeviceBufferAccessorConstPtr& StandardVertexShader::getNormalAccessor() -{ - if constexpr(WithNormal) - return std::get<1>(m_inputAccessors); - else - return nullptr; -} - -template -davinci::DeviceBufferAccessorConstPtr& StandardVertexShader::getUVAccessor() -{ - if constexpr(WithUV) - return std::get(m_inputAccessors); - else - return nullptr; -} -*/ -template -void StandardVertexShader::process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos) -{ - static const float DEFAULT_POSITION[] = {0.f, 0.f, 0.f}; - static const float32_t DEFAULT_NORMAL[] = { 0.f, 0.f, 0.f }; - static const float32_t DEFAULT_TEXCOORD0[] = { 0.f, 0.f}; - - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - davinci::DeviceBufferAccessorConstPtr inputPosition = std::get<0>(m_inputAccessors); - - davinci::DeviceBufferAccessorConstPtr inputNormal = nullptr; - if constexpr(WithNormal) - inputNormal = std::get(m_inputAccessors); - - davinci::DeviceBufferAccessorConstPtr inputUV = nullptr; - if constexpr(WithUV) - inputUV = std::get(m_inputAccessors); - - davinci::fVector3 a_position(inputPosition ? (const float32_t*)(inputPosition->getElement(index)) : DEFAULT_POSITION); - davinci::fVector3 a_normal(inputNormal ? (const float32_t*)(inputNormal->getElement(index)) : DEFAULT_NORMAL); - davinci::fVector2 a_uv(inputUV ? (const float32_t*)(inputUV->getElement(index)) : DEFAULT_TEXCOORD0); - - davinci::fMatrix4 mat_world = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_world = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform"))) - { - mat_world = *p_mat_world; - } - - davinci::fMatrix4 mat_camera_view_proj = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_camera_view_proj = (davinci::fMatrix4*)(uniformBuffer.getAttribute("camera:view_proj_mat"))) - { - mat_camera_view_proj = *p_mat_camera_view_proj; - } - - vertexWorldPos = mat_world * a_position; - davinci::fVector3 v_position = mat_camera_view_proj * vertexWorldPos; - - int32_t outputOffset=0; - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(outputOffset++)->offset, &v_position, sizeof(davinci::fVector3)); - - if constexpr(WithNormal) - { - davinci::fMatrix4 matNormal = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_normal = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform_inverse_trans"))) - { - matNormal = *p_mat_normal; - } - davinci::fVector3 v_normal = (matNormal * davinci::fVector4(a_normal, 0)).xyz().normalise(); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(outputOffset++)->offset, &v_normal, sizeof(davinci::fVector3)); - } - - if constexpr(WithUV) - { - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(outputOffset++)->offset, &a_uv, sizeof(float32_t) * 2); - } -} diff --git a/source/utils/source/scene/dvu_load_gltf.cpp b/source/utils/source/scene/dvu_load_gltf.cpp index 695b3f8..481f25a 100644 --- a/source/utils/source/scene/dvu_load_gltf.cpp +++ b/source/utils/source/scene/dvu_load_gltf.cpp @@ -138,7 +138,7 @@ davinci::VertexElementType _getElementTypeFromGltf(const std::string& gltfElemen if (gltfElementType == "POSITION") { - return davinci::VET_POSITION; + return davinci::VET_POSITION_MODEL; } else if(gltfElementType == "NORMAL") { @@ -296,7 +296,7 @@ davinci::DeviceBufferAccessorPtr _createSupportedPrimitiveAttributeBufferAccesso switch (vetType) { - case davinci::VET_POSITION: + case davinci::VET_POSITION_MODEL: case davinci::VET_NORMAL: case davinci::VET_BINORMAL: if (componentType == davinci::ComponentType::CT_Float32 && dataType == davinci::DataType::DT_Vec3) @@ -558,6 +558,15 @@ bool _loadMesh(tinygltf::Model& gltfModel, davinci::Device& device, davinci::Sce } primitive->material = materialPtr; } + else + { + davinci::MaterialPtr materialPtr = create_standard_material(&device, "classic:phong"); + materialPtr->setParam("u_materialColor", davinci::fVector4::WHITE); + materialPtr->setParam("u_specularShininess", 32.f); + materialPtr->setupMaterial(); + + primitive->material = materialPtr; + } } } return true; @@ -665,45 +674,47 @@ bool _loadMaterial(tinygltf::Model& gltfModel, davinci::Device& device, davinci: tinygltf::Material& gltfMaterial = gltfModel.materials[i]; //create new material - davinci::MaterialPtr materialPtr = create_standard_material(&device, "debug:geometry_normal"); + davinci::MaterialPtr materialPtr = create_standard_material(&device, "pbr:gltf"); //apply matellic roughness info const tinygltf::PbrMetallicRoughness& gltfPBRMetllicRoughness = gltfMaterial.pbrMetallicRoughness; //base color texture const tinygltf::TextureInfo& gltfBaseColorTextureInfo = gltfPBRMetllicRoughness.baseColorTexture; - materialPtr->setBaseColorTexture( + davinci::TextureInfo baseColorTextureInfo = davinci::TextureInfo{ _getTexturePtr(gltfModel, device, gltfBaseColorTextureInfo.index), gltfBaseColorTextureInfo.texCoord, - _getTextureTransform(gltfBaseColorTextureInfo.extensions), - _getVector4FromDoubleArray(gltfPBRMetllicRoughness.baseColorFactor) - ); + _getTextureTransform(gltfBaseColorTextureInfo.extensions) + }; + materialPtr->setParam("u_baseColorTextureInfo", baseColorTextureInfo); //matallic & roughness texture const tinygltf::TextureInfo& gltfMetalicRoughnessTextureInfo = gltfPBRMetllicRoughness.metallicRoughnessTexture; - materialPtr->setMetallicRoughnessTexture( + davinci::TextureInfo metalicRoughnessTextureInfo = davinci::TextureInfo{ _getTexturePtr(gltfModel, device, gltfMetalicRoughnessTextureInfo.index), gltfMetalicRoughnessTextureInfo.texCoord, _getTextureTransform(gltfMetalicRoughnessTextureInfo.extensions), - gltfPBRMetllicRoughness.metallicFactor, - gltfPBRMetllicRoughness.roughnessFactor - ); + }; + materialPtr->setParam("u_metalicRoughnessTextureInfo", baseColorTextureInfo); + materialPtr->setParam("u_metalicFactor", static_cast(gltfPBRMetllicRoughness.metallicFactor)); + materialPtr->setParam("u_roughnessFactor", static_cast(gltfPBRMetllicRoughness.roughnessFactor)); //normal texture const tinygltf::NormalTextureInfo& gltfNormalTextureInfo = gltfMaterial.normalTexture; - materialPtr->setNormalTexture( + davinci::TextureInfo normalTextureInfo = davinci::TextureInfo{ _getTexturePtr(gltfModel, device, gltfNormalTextureInfo.index), gltfNormalTextureInfo.texCoord, _getTextureTransform(gltfNormalTextureInfo.extensions), - gltfMaterial.normalTexture.scale - ); + }; + materialPtr->setParam("u_normalTextureInfo", normalTextureInfo); + materialPtr->setParam("u_normalTextureScale", static_cast(gltfMaterial.normalTexture.scale)); //load shader - if (!(materialPtr->loadShader())) + if (!(materialPtr->setupMaterial())) { return false; } - + gltfMaterial.extensions.insert(std::make_pair("DAVINCI_ID", tinygltf::Value((int32_t)materialPtr->getID()))); } return true; diff --git a/source/utils/source/standard/dvu_standard_material.cpp b/source/utils/source/standard/dvu_standard_material.cpp index b84b20c..0a4fccc 100644 --- a/source/utils/source/standard/dvu_standard_material.cpp +++ b/source/utils/source/standard/dvu_standard_material.cpp @@ -4,34 +4,168 @@ DV_UTILS_BEGIN_NAMESPACE +class PbrGltfMaterial : public davinci::Material +{ +public: + PbrGltfMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal+uv0"); + setFragementShader("dv_standard_shaders.dll", "pbr:gltf"); + + registerParam("u_baseColorTextureInfo", {}); + registerParam("u_metalicRoughnessTextureInfo", {}); + registerParam("u_metalicFactor", 1.f); + registerParam("u_roughnessFactor", 1.f); + registerParam("u_normalTextureInfo", {}); + registerParam("u_normalTextureScale", 1.f); + } +}; + +class PhongMaterial : public davinci::Material +{ +public: + PhongMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal-uv0"); + setFragementShader("dv_standard_shaders.dll", "classic:phong"); + + registerParam("u_materialColor", davinci::fVector4::GREEN); + registerParam("u_specularShininess", 64.f); + registerParam("u_specularStrength", 5.f); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + return true; + } +}; + +class SolidColorMaterial : public davinci::Material +{ +public: + SolidColorMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard-worldpos-normal-uv0"); + setFragementShader("dv_standard_shaders.dll", "debug:solid_color"); + + registerParam("u_solidColor", davinci::fVector4::WHITE); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + return true; + } +}; + +class BaseColorTextureMaterial : public davinci::Material +{ +public: + BaseColorTextureMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0"); + setFragementShader("dv_standard_shaders.dll", "debug:show_texture"); + + registerParam("u_textureInfo", {}); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + davinci::TextureInfo baseColorTextureInfo; + if (!(orginalMaterial->getParam("u_baseColorTextureInfo", baseColorTextureInfo))) + { + return false; + } + + this->setParam("u_textureInfo", baseColorTextureInfo); + return true; + } +}; + +class NormalTextureMaterial : public davinci::Material +{ +public: + NormalTextureMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0"); + setFragementShader("dv_standard_shaders.dll", "debug:show_texture"); + + registerParam("u_textureInfo", {}); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + davinci::TextureInfo normalTextureInfo; + if (!(orginalMaterial->getParam("u_normalTextureInfo", normalTextureInfo))) + { + return false; + } + + this->setParam("u_textureInfo", normalTextureInfo); + return true; + } +}; + +class TextureCoordinates0Material : public davinci::Material +{ +public: + TextureCoordinates0Material(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0"); + setFragementShader("dv_standard_shaders.dll", "debug:texture_coordinates"); + + registerParam("u_texCoord", 0); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + return true; + } +}; + +class GeometryNormalMaterial : public davinci::Material +{ +public: + GeometryNormalMaterial(int32_t id, const char* name) : davinci::Material(id, name) + { + setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal-uv0"); + setFragementShader("dv_standard_shaders.dll", "debug:geometry_normal"); + } + virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override + { + return true; + } +}; + davinci::MaterialPtr create_standard_material(davinci::Device* device, const char* name) { - if (strcmp(name, "debug:base_color")==0) + if(strcmp(name, "pbr:gltf")==0) { - davinci::MaterialPtr materialPtr = device->newMaterialAsset(); - materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv"); - materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:base_color"); + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); + return materialPtr; + } + else if(strcmp(name, "classic:phong")==0) + { + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); + return materialPtr; + } + else if(strcmp(name, "debug:solid_color")==0) + { + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); + return materialPtr; + } + else if (strcmp(name, "debug:base_color_texture")==0) + { + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); return materialPtr; } else if (strcmp(name, "debug:normal_texture")==0) { - davinci::MaterialPtr materialPtr = device->newMaterialAsset(); - materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv"); - materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:normal_texture"); + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); return materialPtr; } - else if (strcmp(name, "debug:texture_coordinates")==0) + else if (strcmp(name, "debug:texture_coordinates_0")==0) { - davinci::MaterialPtr materialPtr = device->newMaterialAsset(); - materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv"); - materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:texture_coordinates"); + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); return materialPtr; } else if (strcmp(name, "debug:geometry_normal")==0) { - davinci::MaterialPtr materialPtr = device->newMaterialAsset(); - materialPtr->setVertexShader("dv_standard_shaders.dll", "standard+normal-uv"); - materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:geometry_normal"); + davinci::MaterialPtr materialPtr = device->newMaterialAsset(name); return materialPtr; } return nullptr; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 95ecbf9..303324e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,5 +2,4 @@ set(GTest_DIR $ENV{LIBRARIES_SDK_ROOT}/gtest/lib/cmake/GTest) find_package(GTest CONFIG REQUIRED) add_subdirectory(unit) -add_subdirectory(shader) add_subdirectory(rasterization) diff --git a/test/shader/CMakeLists.txt b/test/shader/CMakeLists.txt deleted file mode 100644 index 89728a4..0000000 --- a/test/shader/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -add_library(TestShader SHARED - dll_main.cpp - test_vertex_shader.h - test_vertex_shader.cpp - test_vertex_shader.osl - test_pixel_shader.h - test_pixel_shader.cpp - test_pixel_shader.osl -) - -add_definitions(-DDV_SHADER_EXPORTS) - -target_include_directories(TestShader -PRIVATE - ${DV_AUTO_INCLUDE_PATH} - ${DV_CORE_INCLUDE_PATH} -) - -target_link_libraries(TestShader - dv_core -) - -################# -# copy runtime dll(for debug) -################# -add_custom_command( - TARGET TestShader POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_BINARY_DIR}/source/console/$<$:Debug>$<$:Release>) diff --git a/test/shader/dll_main.cpp b/test/shader/dll_main.cpp deleted file mode 100644 index 72a28d7..0000000 --- a/test/shader/dll_main.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "dv_config.h" -#include "shader/dvc_shader_interface.h" - -#include "test_vertex_shader.h" -#include "test_pixel_shader.h" - -class TestShaderInterface : public davinci::ShaderFileInterface -{ -public: - virtual davinci::VertexShaderInterface* getVertexShader(const char* szName) - { - if (strcmp(szName, "test") == 0) - { - static TestVertexShader testVertexShader; - return &testVertexShader; - } - return nullptr; - } - virtual davinci::PixelShaderInterface* getPixelShader(const char* szName) - { - static TestPixelShader testPixelShader; - if (strcmp(szName, testPixelShader.getName()) == 0) - { - return &testPixelShader; - } - return nullptr; - } -}; - -extern "C" -{ - -__declspec(dllexport) davinci::ShaderFileInterface* ShaderFileInterface() -{ - static TestShaderInterface theInterface; - return &theInterface; -} - -} diff --git a/test/shader/phong_shader.oso b/test/shader/phong_shader.oso deleted file mode 100644 index 9fd9ebb..0000000 --- a/test/shader/phong_shader.oso +++ /dev/null @@ -1,109 +0,0 @@ -OpenShadingLanguage 1.00 -# Compiled by oslc 1.13.12.0 -# options: -shader phong_shader -param point v_position 0 0 0 %read{2147483647,-1} %write{0,0} %initexpr -param vector v_normal 0 1 0 %read{3,3} %write{2147483647,-1} -param vector v_toCamera 0 0 0 %read{2,2} %write{2147483647,-1} -param vector v_toLight 0 0 0 %read{1,1} %write{2147483647,-1} -oparam color resultRGB 0 0 0 %read{2147483647,-1} %write{27,27} -local vector vL %read{4,14} %write{1,1} -local vector vV %read{8,8} %write{2,2} -local vector vN %read{4,18} %write{3,3} -local vector vR %read{2147483647,-1} %write{7,7} -local vector vH %read{18,18} %write{9,9} -local color u_ambientColor %read{13,13} %write{10,10} -local color u_matColor %read{13,23} %write{11,11} -local color u_lightColor %read{17,24} %write{12,12} -local color colAmbient %read{25,25} %write{13,13} -local float ndotl %read{16,20} %write{15,15} -local color colDiff %read{25,25} %write{17,17} -local float spec %read{21,21} %write{19,19} -local color colSpec %read{26,26} %write{24,24} -local color final %read{27,27} %write{26,26} -const vector $const1 0 0 0 %read{0,0} %write{2147483647,-1} -temp float $tmp1 %read{5,5} %write{4,4} -temp float $tmp2 %read{6,6} %write{5,5} -const float $const3 2 %read{5,5} %write{2147483647,-1} -temp vector $tmp3 %read{7,7} %write{6,6} -temp vector $tmp4 %read{9,9} %write{8,8} -temp int $tmp5 %read{2147483647,-1} %write{10,10} -const string $const4 "env:ambient_color" %read{10,10} %write{2147483647,-1} -temp int $tmp6 %read{2147483647,-1} %write{11,11} -const string $const5 "self:mat_color" %read{11,11} %write{2147483647,-1} -temp int $tmp7 %read{2147483647,-1} %write{12,12} -const string $const6 "light0:color" %read{12,12} %write{2147483647,-1} -temp float $tmp8 %read{15,15} %write{14,14} -const float $const8 0 %read{15,20} %write{2147483647,-1} -temp color $tmp9 %read{17,17} %write{16,16} -temp float $tmp10 %read{19,19} %write{18,18} -temp float $tmp11 %read{22,22} %write{20,20} -temp float $tmp12 %read{22,22} %write{21,21} -const float $const10 64 %read{21,21} %write{2147483647,-1} -temp float $tmp13 %read{23,23} %write{22,22} -temp color $tmp14 %read{24,24} %write{23,23} -temp color $tmp15 %read{26,26} %write{25,25} -const vector $const11 0.454545438 0.454545438 0.454545438 %read{27,27} %write{2147483647,-1} -code v_position -# test_pixel_shader.osl:4 -# point v_position = vector(0,0,0), - assign v_position $const1 %filename{"test_pixel_shader.osl"} %line{4} %argrw{"wr"} -code ___main___ -# test_pixel_shader.osl:11 -# vector vL = normalize(v_toLight); - normalize vL v_toLight %filename{"test_pixel_shader.osl"} %line{11} %argrw{"wr"} -# test_pixel_shader.osl:12 -# vector vV = normalize(v_toCamera); - normalize vV v_toCamera %line{12} %argrw{"wr"} -# test_pixel_shader.osl:13 -# vector vN = normalize(v_normal); - normalize vN v_normal %line{13} %argrw{"wr"} -# test_pixel_shader.osl:14 -# vector vR = 2 * dot(vL, vN)*vN - vL; - dot $tmp1 vL vN %line{14} %argrw{"wrr"} - mul $tmp2 $const3 $tmp1 %argrw{"wrr"} - mul $tmp3 $tmp2 vN %argrw{"wrr"} - sub vR $tmp3 vL %argrw{"wrr"} -# test_pixel_shader.osl:15 -# vector vH = normalize(vL + vV); - add $tmp4 vL vV %line{15} %argrw{"wrr"} - normalize vH $tmp4 %argrw{"wr"} -# test_pixel_shader.osl:18 -# getattribute("env:ambient_color", u_ambientColor); - getattribute $tmp5 $const4 u_ambientColor %line{18} %argrw{"wrw"} -# test_pixel_shader.osl:21 -# getattribute("self:mat_color", u_matColor); - getattribute $tmp6 $const5 u_matColor %line{21} %argrw{"wrw"} -# test_pixel_shader.osl:24 -# getattribute("light0:color", u_lightColor); - getattribute $tmp7 $const6 u_lightColor %line{24} %argrw{"wrw"} -# test_pixel_shader.osl:26 -# color colAmbient = u_ambientColor*u_matColor; - mul colAmbient u_ambientColor u_matColor %line{26} %argrw{"wrr"} -# test_pixel_shader.osl:28 -# float ndotl = max(dot(vN, vL), 0); - dot $tmp8 vN vL %line{28} %argrw{"wrr"} - max ndotl $tmp8 $const8 %argrw{"wrr"} -# test_pixel_shader.osl:29 -# color colDiff = ndotl * u_matColor * u_lightColor; - mul $tmp9 ndotl u_matColor %line{29} %argrw{"wrr"} - mul colDiff $tmp9 u_lightColor %argrw{"wrr"} -# test_pixel_shader.osl:31 -# float spec = max(dot(vN, vH), 0); - dot $tmp10 vN vH %line{31} %argrw{"wrr"} - max spec $tmp10 $const8 %argrw{"wrr"} -# test_pixel_shader.osl:32 -# color colSpec = step(0, ndotl) * pow(spec, 64) * u_matColor * u_lightColor; - step $tmp11 $const8 ndotl %line{32} %argrw{"wrr"} - pow $tmp12 spec $const10 %argrw{"wrr"} - mul $tmp13 $tmp11 $tmp12 %argrw{"wrr"} - mul $tmp14 $tmp13 u_matColor %argrw{"wrr"} - mul colSpec $tmp14 u_lightColor %argrw{"wrr"} -# test_pixel_shader.osl:34 -# color final = colAmbient + colDiff + colSpec; - add $tmp15 colAmbient colDiff %line{34} %argrw{"wrr"} - add final $tmp15 colSpec %argrw{"wrr"} -# test_pixel_shader.osl:37 -# resultRGB = pow(final, vector(1.0/2.2)); - pow resultRGB final $const11 %line{37} %argrw{"wrr"} - end diff --git a/test/shader/standard_shader.oso b/test/shader/standard_shader.oso deleted file mode 100644 index daa1e48..0000000 --- a/test/shader/standard_shader.oso +++ /dev/null @@ -1,64 +0,0 @@ -OpenShadingLanguage 1.00 -# Compiled by oslc 1.13.12.0 -# options: -shader standard_shader -param point a_position 0 0 0 %meta{string,attribute,"POSITION"} %read{5,5} %write{0,0} %initexpr -param vector a_normal 0 1 0 %meta{string,attribute,"NORMAL"} %read{7,7} %write{2147483647,-1} -param float[2] a_uv 0 0 %meta{string,attribute,"TEXCOORD_0"} %read{8,8} %write{2147483647,-1} -oparam point v_position 0 0 0 %read{9,11} %write{6,6} -oparam vector v_normal 0 1 0 %read{2147483647,-1} %write{7,7} -oparam float[2] v_uv 0 0 %read{2147483647,-1} %write{8,8} -oparam vector v_toCamera 0 0 0 %read{2147483647,-1} %write{10,10} -oparam vector v_toLight 0 0 0 %read{2147483647,-1} %write{12,12} -local matrix mat_world %read{5,5} %write{1,1} -local matrix mat_camera_view_proj %read{6,6} %write{2,2} -local point camera_position %read{9,9} %write{3,3} -local point light0_position %read{11,11} %write{4,4} -const vector $const1 0 0 0 %read{0,0} %write{2147483647,-1} -temp int $tmp1 %read{2147483647,-1} %write{1,1} -const string $const2 "self:world_transform" %read{1,1} %write{2147483647,-1} -temp int $tmp2 %read{2147483647,-1} %write{2,2} -const string $const3 "camera:view_proj" %read{2,2} %write{2147483647,-1} -temp int $tmp3 %read{2147483647,-1} %write{3,3} -const string $const4 "camera:position" %read{3,3} %write{2147483647,-1} -temp int $tmp4 %read{2147483647,-1} %write{4,4} -const string $const5 "light0:position" %read{4,4} %write{2147483647,-1} -temp point $tmp5 %read{6,6} %write{5,5} -temp vector $tmp6 %read{10,10} %write{9,9} -temp vector $tmp7 %read{12,12} %write{11,11} -code a_position -# test_vertex_shader.osl:6 -# point a_position = vector(0, 0, 0) [[ string attribute="POSITION"]], - assign a_position $const1 %filename{"test_vertex_shader.osl"} %line{6} %argrw{"wr"} -code ___main___ -# test_vertex_shader.osl:19 -# getattribute("self:world_transform", mat_world); - getattribute $tmp1 $const2 mat_world %filename{"test_vertex_shader.osl"} %line{19} %argrw{"wrw"} -# test_vertex_shader.osl:25 -# getattribute("camera:view_proj", mat_camera_view_proj); - getattribute $tmp2 $const3 mat_camera_view_proj %line{25} %argrw{"wrw"} -# test_vertex_shader.osl:28 -# getattribute("camera:position", camera_position); - getattribute $tmp3 $const4 camera_position %line{28} %argrw{"wrw"} -# test_vertex_shader.osl:31 -# getattribute("light0:position", light0_position); - getattribute $tmp4 $const5 light0_position %line{31} %argrw{"wrw"} -# test_vertex_shader.osl:34 -# v_position = transform(mat_camera_view_proj, transform(mat_world, a_position)); - transform $tmp5 mat_world a_position %line{34} %argrw{"wrr"} - transform v_position mat_camera_view_proj $tmp5 %argrw{"wrr"} -# test_vertex_shader.osl:35 -# v_normal = a_normal; - assign v_normal a_normal %line{35} %argrw{"wr"} -# test_vertex_shader.osl:36 -# v_uv = a_uv; - arraycopy v_uv a_uv %line{36} %argrw{"wr"} -# test_vertex_shader.osl:38 -# v_toCamera = normalize(camera_position-v_position); - sub $tmp6 camera_position v_position %line{38} %argrw{"wrr"} - normalize v_toCamera $tmp6 %argrw{"wr"} -# test_vertex_shader.osl:39 -# v_toLight = normalize(light0_position-v_position); - sub $tmp7 light0_position v_position %line{39} %argrw{"wrr"} - normalize v_toLight $tmp7 %argrw{"wr"} - end diff --git a/test/shader/test_pixel_shader.cpp b/test/shader/test_pixel_shader.cpp deleted file mode 100644 index 7fb8ba3..0000000 --- a/test/shader/test_pixel_shader.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "test_pixel_shader.h" -#include "device/dvc_device.h" -#include "device/dvc_uniform_buffer.h" -#include "asset/dvc_texture.h" -#include "shader/dvc_shader_functions.h" -#include "pipe/dvc_render_pipe.h" - -using namespace davinci; - -const char* TestPixelShader::getName(void) const -{ - return "test"; -} - -void TestPixelShader::prepare(const RenderPipe* pipe, davinci::MaterialConstPtr material) -{ - m_pipe = pipe; -} - -void TestPixelShader::process(const VertexDesc& veretexDesc, const float32_t* pixelData, fVector4& color) -{ - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - const VertexDesc::Element* v_normal_Element = veretexDesc.getElement("v_normal"); - const fVector3* v_normal = (const fVector3*)(pixelData + (v_normal_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_uv_Element = veretexDesc.getElement("v_uv"); - const fVector2* v_uv = (const fVector2*)(pixelData + (v_uv_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_toCamera_Element = veretexDesc.getElement("v_toCamera"); - const fVector3* v_toCamera = (const fVector3*)(pixelData + (v_toCamera_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_toLight_Element = veretexDesc.getElement("v_toLight"); - const fVector3* v_toLight = (const fVector3*)(pixelData + (v_toLight_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_tangent_Element = veretexDesc.getElement("v_tangent"); - const fVector3* v_tangent = (const fVector3*)(pixelData + (v_tangent_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_binormal_Element = veretexDesc.getElement("v_binormal"); - const fVector3* v_binormal = (const fVector3*)(pixelData + (v_binormal_Element->offset / sizeof(float32_t))); - - const VertexDesc::Element* v_wposition_Element = veretexDesc.getElement("v_wposition"); - const fVector3* v_wposition = (const fVector3*)(pixelData + (v_wposition_Element->offset / sizeof(float32_t))); - - fMatrix3 tbnMatrix = fMatrix3( - v_tangent->x, v_binormal->x, v_normal->x, - v_tangent->y, v_binormal->y, v_normal->y, - v_tangent->z, v_binormal->z, v_normal->z); - - davinci::fVector3 light0_position = davinci::fVector3::ZERO; - if (davinci::fVector3* p_light0_position = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:position"))) - { - light0_position = *p_light0_position; - } - - //davinci::fVector3 camera_position = davinci::fVector3::ZERO; - //if (davinci::fVector3* p_camera_position = (davinci::fVector3*)(uniformBuffer.getAttribute("camera:eye_pos"))) - //{ - // camera_position = *p_camera_position; - //} - - fVector3 lp = light0_position - *v_wposition; - fVector3 vLight = lp.normalise() * tbnMatrix; - - fVector3 u_ambientColor = fVector3(0.2, 0.2, 0.2); - - fVector3 u_matColor = fVector3(1.0, 1.0, 1.0); - - fVector3 u_lightColor = fVector3(1.0, 1.0, 1.0); - - fVector4 u_textureColor;// = shader::texture2D(*m_pipe, "material:pbr:base_color_texture", *v_uv, fVector4::WHITE); - - const fVector4 defaultNormal = fVector4(0.5f, 0.5f, 1.0f, 1.0f); - fVector4 u_normalColor;// = shader::texture2D(*m_pipe, "material:pbr:normal_texture", *v_uv, defaultNormal); - - //---------------- - fVector3 vN = u_normalColor.xyz() * 2.0f - fVector3::ONE; - vN.normalise(); - - fVector3 vL =vLight; - vL.normalise(); - - fVector3 vV = *v_toCamera; - vV.normalise(); - - float ndotl = vL.dotProduct(vN); - fVector3 vR = 2 * ndotl * vN - vL; - - float rdotv = vR.dotProduct(vV); - - fVector3 colAmbient = u_ambientColor * u_matColor; - fVector3 colDiff = shader::max(0.0f, ndotl) * u_matColor* u_lightColor; - - const float _m = 1.0f; - float spec = shader::step(0.0f, ndotl) * shader::pow(shader::max(0.0f, rdotv), 32.f); - fVector3 colSpec = spec * u_matColor* u_lightColor; - - fVector3 final = fVector3::BLACK; - //final += colAmbient; - final += colDiff; - //final += colSpec; - //final *= u_textureColor.xyz(); - - //final = u_normalColor.xyz(); - //color = fVector4::RED; - color = fVector4(final.saturate(), 1.0f);// fVector4::RED; -} - diff --git a/test/shader/test_pixel_shader.h b/test/shader/test_pixel_shader.h deleted file mode 100644 index de1aa49..0000000 --- a/test/shader/test_pixel_shader.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "dvc_config.h" -#include "shader/dvc_shader_interface.h" - -class TestPixelShader : public davinci::PixelShaderInterface -{ -public: - virtual const char* getName(void) const; - - virtual void prepare(const davinci::RenderPipe* pipe, davinci::MaterialConstPtr material); - - virtual void process(const davinci::VertexDesc& veretexDesc, const float32_t* pixelData, - davinci::fVector4& color); -private: - const davinci::RenderPipe* m_pipe = nullptr; -}; - diff --git a/test/shader/test_pixel_shader.osl b/test/shader/test_pixel_shader.osl deleted file mode 100644 index da646c9..0000000 --- a/test/shader/test_pixel_shader.osl +++ /dev/null @@ -1,38 +0,0 @@ - -shader -phong_shader( - point v_position = vector(0,0,0), - vector v_normal = vector(0,1,0), - vector v_toCamera = vector(0,0,0), - vector v_toLight = vector(0,0,0), - output color resultRGB = 0 -) -{ - vector vL = normalize(v_toLight); - vector vV = normalize(v_toCamera); - vector vN = normalize(v_normal); - vector vR = 2 * dot(vL, vN)*vN - vL; - vector vH = normalize(vL + vV); - - color u_ambientColor; - getattribute("env:ambient_color", u_ambientColor); - - color u_matColor; - getattribute("self:mat_color", u_matColor); - - color u_lightColor; - getattribute("light0:color", u_lightColor); - - color colAmbient = u_ambientColor*u_matColor; - - float ndotl = max(dot(vN, vL), 0); - color colDiff = ndotl * u_matColor * u_lightColor; - - float spec = max(dot(vN, vH), 0); - color colSpec = step(0, ndotl) * pow(spec, 64) * u_matColor * u_lightColor; - - color final = colAmbient + colDiff + colSpec; - - //gamma - resultRGB = pow(final, vector(1.0/2.2)); -} diff --git a/test/shader/test_vertex_shader.cpp b/test/shader/test_vertex_shader.cpp deleted file mode 100644 index a93fe51..0000000 --- a/test/shader/test_vertex_shader.cpp +++ /dev/null @@ -1,195 +0,0 @@ -#include "test_vertex_shader.h" -#include "device/dvc_buffer_accessor.h" -#include "math/dvc_vector2.h" -#include "math/dvc_vector3.h" -#include "math/dvc_matrix4.h" -#include "pipe/dvc_render_pipe.h" -#include "device/dvc_uniform_buffer.h" - -TestVertexShader::TestVertexShader() -{ - //output point v_position = point(0, 0, 0) [[ string attribute="POSITION"]], - m_outputVertexDesc.addElement("v_position", davinci::VET_POSITION, davinci::CT_Float32, davinci::DT_Vec3); - //output vector v_normal = vector(0,1,0) [[ string attribute="NORMAL"]], - m_outputVertexDesc.addElement("v_normal", davinci::VET_NORMAL, davinci::CT_Float32, davinci::DT_Vec3); - //output float v_uv[2] = {0, 0} [[ string attribute="TEXCOORD_0"]], - m_outputVertexDesc.addElement("v_uv", davinci::VET_TEXCOORD_0, davinci::CT_Float32, davinci::DT_Vec2); - //output vector v_toCamera = vector(0, 0, 0), - m_outputVertexDesc.addElement("v_toCamera", davinci::VET_UNKNOWN, davinci::CT_Float32, davinci::DT_Vec3); - //output vector v_toLight = vector(0,0,0) - m_outputVertexDesc.addElement("v_toLight", davinci::VET_UNKNOWN, davinci::CT_Float32, davinci::DT_Vec3); - - m_outputVertexDesc.addElement("v_tangent", davinci::VET_TANGENT, davinci::CT_Float32, davinci::DT_Vec3); - m_outputVertexDesc.addElement("v_binormal", davinci::VET_BINORMAL, davinci::CT_Float32, davinci::DT_Vec3); - m_outputVertexDesc.addElement("v_wposition", davinci::VET_UNKNOWN, davinci::CT_Float32, davinci::DT_Vec3); -} - -TestVertexShader::~TestVertexShader() -{ - -} - -const char* TestVertexShader::getName(void) const -{ - return "test"; -} - -size_t TestVertexShader::getOutputVertexByteSize(void) const -{ - return m_outputVertexDesc.vertexByteSize(); -} - -const davinci::VertexDesc& TestVertexShader::getOutputVertexDesc() const -{ - return m_outputVertexDesc; -} - -void TestVertexShader::prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) -{ - m_pipe = pipe; - - //point a_position = vector(0, 0, 0) [[ string attribute="POSITION"]], - m_POSITION = setInputAttributeFunc(davinci::VET_POSITION); - //vector a_normal = vector(0, 1, 0) [[ string attribute="NORMAL"]], - m_NORMAL = setInputAttributeFunc(davinci::VET_NORMAL); - //float a_uv[2] = {0,0} [[ string attribute="TEXCOORD_0"]], - m_TEXCOORD_0 = setInputAttributeFunc(davinci::VET_TEXCOORD_0); - // - m_TANGENT = setInputAttributeFunc(davinci::VET_TANGENT); -} - -void TestVertexShader::process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos) -{ - static const float32_t DEFAULT_POSITION[] = {0.f, 0.f, 0.f}; - static const float32_t DEFAULT_NORMAL[] = { 0.f, 0.f, 0.f }; - static const float32_t DEFAULT_TEXCOORD0[] = { 0.f, 0.f}; - static const float32_t DEFAULT_TANGENT[] = { 1.f, 0.f, 0.f, 1.f }; - - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - davinci::fVector3 a_position(m_POSITION ? (const float32_t*)(m_POSITION->getElement(index)) : DEFAULT_POSITION); - - davinci::fVector3 a_normal(m_NORMAL ? (const float32_t*)(m_NORMAL->getElement(index)) : DEFAULT_NORMAL); - - davinci::fVector2 a_uv(m_TEXCOORD_0 ? (const float32_t*)(m_TEXCOORD_0->getElement(index)) : DEFAULT_TEXCOORD0); - - davinci::fVector4 a_tangent(m_TANGENT ? (const float32_t*)(m_TANGENT->getElement(index)) : DEFAULT_TANGENT); - - davinci::fMatrix4 mat_world = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_world = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform"))) - { - mat_world = *p_mat_world; - } - - davinci::fMatrix4 mat_camera_view_proj = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_camera_view_proj = (davinci::fMatrix4*)(uniformBuffer.getAttribute("camera:view_proj_mat"))) - { - mat_camera_view_proj = *p_mat_camera_view_proj; - } - - davinci::fVector3 camera_position = davinci::fVector3::ZERO; - if (davinci::fVector3* p_camera_position = (davinci::fVector3*)(uniformBuffer.getAttribute("camera:eye_pos"))) - { - camera_position = *p_camera_position; - } - - davinci::fVector3 light0_position = davinci::fVector3::ZERO; - if (davinci::fVector3* p_light0_position = (davinci::fVector3*)(uniformBuffer.getAttribute("light0:position"))) - { - light0_position = *p_light0_position; - } - - davinci::fVector3 temp1 = mat_world * a_position; - davinci::fVector3 v_position = mat_camera_view_proj * temp1; - - davinci::fMatrix4 matNormal = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_normal = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform_inverse_trans"))) - { - matNormal = *p_mat_normal; - } - davinci::fVector3 v_normal = (matNormal * davinci::fVector4(a_normal, 0)).xyz().normalise(); - davinci::fVector3 v_tangent = (matNormal * davinci::fVector4(a_tangent.xyz(), 0)).xyz().normalise(); - davinci::fVector3 v_binormal = v_normal.crossProduct(v_tangent).normalise();// *a_tangent.w; - - davinci::fMatrix3 tbnMatrix = davinci::fMatrix3( - v_tangent.x, v_binormal.x, v_normal.x, - v_tangent.y, v_binormal.y, v_normal.y, - v_tangent.z, v_binormal.z, v_normal.z); - - davinci::fVector3 v_to_camera = (camera_position - temp1).normalise() * tbnMatrix; - davinci::fVector3 v_to_light = (light0_position - temp1).normalise() * tbnMatrix; - - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(0)->offset, &v_position, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(1)->offset, &v_normal, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(2)->offset, &a_uv, sizeof(float32_t) * 2); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(3)->offset, &v_to_camera, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(4)->offset, &v_to_light, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(5)->offset, &v_tangent, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(6)->offset, &v_binormal, sizeof(davinci::fVector3)); - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(7)->offset, &temp1, sizeof(davinci::fVector3)); - - vertexWorldPos = mat_world * a_position; -} - - -StandardVertexShader::StandardVertexShader() -{ - //output point v_position = point(0, 0, 0) [[ string attribute="POSITION"]], - m_outputVertexDesc.addElement("v_position", davinci::VET_POSITION, davinci::CT_Float32, davinci::DT_Vec3); -} - -StandardVertexShader::~StandardVertexShader() -{ - -} - -const char* StandardVertexShader::getName(void) const -{ - return "standard"; -} - -size_t StandardVertexShader::getOutputVertexByteSize(void) const -{ - return m_outputVertexDesc.vertexByteSize(); -} - -const davinci::VertexDesc& StandardVertexShader::getOutputVertexDesc() const -{ - return m_outputVertexDesc; -} - -void StandardVertexShader::prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc) -{ - m_pipe = pipe; - - //point a_position = vector(0, 0, 0) [[ string attribute="POSITION"]], - m_POSITION = setInputAttributeFunc(davinci::VET_POSITION); -} - -void StandardVertexShader::process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos) -{ - static const float DEFAULT_POSITION[] = {0.f, 0.f, 0.f}; - - const davinci::UniformBuffer& uniformBuffer = m_pipe->getUniformBuffer(); - - davinci::fVector3 a_position(m_POSITION ? (const float32_t*)(m_POSITION->getElement(index)) : DEFAULT_POSITION); - - davinci::fMatrix4 mat_world = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_world = (davinci::fMatrix4*)(uniformBuffer.getAttribute("self:world_transform"))) - { - mat_world = *p_mat_world; - } - - davinci::fMatrix4 mat_camera_view_proj = davinci::fMatrix4::IDENTITY; - if (davinci::fMatrix4* p_mat_camera_view_proj = (davinci::fMatrix4*)(uniformBuffer.getAttribute("camera:view_proj_mat"))) - { - mat_camera_view_proj = *p_mat_camera_view_proj; - } - - davinci::fVector3 temp1 = mat_world * a_position; - davinci::fVector3 v_position = mat_camera_view_proj * temp1; - - memcpy((char*)outputVertex + m_outputVertexDesc.getElement(0)->offset, &v_position, sizeof(davinci::fVector3)); - - vertexWorldPos = mat_world * a_position; -} diff --git a/test/shader/test_vertex_shader.h b/test/shader/test_vertex_shader.h deleted file mode 100644 index c044704..0000000 --- a/test/shader/test_vertex_shader.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "dvc_config.h" -#include "dvc_pre_declare.h" -#include "shader/dvc_shader_interface.h" -#include "device/dvc_vertex_desc.h" - -class TestVertexShader : public davinci::VertexShaderInterface -{ -public: - virtual const char* getName(void) const; - - virtual const davinci::VertexDesc& getOutputVertexDesc() const; - virtual size_t getOutputVertexByteSize(void) const; - - virtual void prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc); - - virtual void process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos); - -private: - const davinci::RenderPipe* m_pipe = nullptr; - - davinci::DeviceBufferAccessorConstPtr m_POSITION; - davinci::DeviceBufferAccessorConstPtr m_NORMAL; - davinci::DeviceBufferAccessorConstPtr m_TEXCOORD_0; - davinci::DeviceBufferAccessorConstPtr m_TANGENT; - - davinci::VertexDesc m_outputVertexDesc; - -public: - TestVertexShader(); - virtual ~TestVertexShader(); -}; - -class StandardVertexShader : public davinci::VertexShaderInterface -{ -public: - virtual const char* getName(void) const; - virtual const davinci::VertexDesc& getOutputVertexDesc() const; - virtual size_t getOutputVertexByteSize(void) const; - virtual void prepare(const davinci::RenderPipe* pipe, SetInputAttributeFunc setInputAttributeFunc); - virtual void process(size_t index, void* outputVertex, davinci::fVector3& vertexWorldPos); - -private: - const davinci::RenderPipe* m_pipe = nullptr; - davinci::DeviceBufferAccessorConstPtr m_POSITION; - - davinci::VertexDesc m_outputVertexDesc; - -public: - StandardVertexShader(); - virtual ~StandardVertexShader(); -}; diff --git a/test/shader/test_vertex_shader.osl b/test/shader/test_vertex_shader.osl deleted file mode 100644 index 60fabbb..0000000 --- a/test/shader/test_vertex_shader.osl +++ /dev/null @@ -1,40 +0,0 @@ - -// - -shader -standard_shader( - point a_position = vector(0, 0, 0) [[ string attribute="POSITION"]], - vector a_normal = vector(0, 1, 0) [[ string attribute="NORMAL"]], - float a_uv[2] = {0,0} [[ string attribute="TEXCOORD_0"]], - - output point v_position = point(0, 0, 0) [[ string attribute="POSITION"]], - output vector v_normal = vector(0,1,0) [[ string attribute="NORMAL"]], - output float v_uv[2] = {0, 0} [[ string attribute="TEXCOORD_0"]], - - output vector v_toCamera = vector(0, 0, 0), - output vector v_toLight = vector(0, 0, 0) -) -{ - matrix mat_world; - getattribute("self:world_transform", mat_world); - - //matrix mat_normal; - //getattribute("self:normal_transform", mat_normal); - - matrix mat_camera_view_proj; - getattribute("camera:view_proj", mat_camera_view_proj); - - point camera_position; - getattribute("camera:eye_pos", camera_position); - - point light0_position; - getattribute("light0:position", light0_position); - - - v_position = transform(mat_camera_view_proj, transform(mat_world, a_position)); - v_normal = a_normal; - v_uv = a_uv; - - v_toCamera = normalize(camera_position-v_position); - v_toLight = normalize(light0_position-v_position); -}