diff --git a/ShaderLibrary/Std2D/RectTexture2DArray.mtl b/ShaderLibrary/Std2D/RectTexture2DArray.mtl index 19d247db..f9c7be18 100644 --- a/ShaderLibrary/Std2D/RectTexture2DArray.mtl +++ b/ShaderLibrary/Std2D/RectTexture2DArray.mtl @@ -61,7 +61,7 @@ Code #Fragment -sampler2DArray TextureColor +sampler2DArray TextureBaseColor Output { @@ -74,6 +74,6 @@ Code { MaterialInstance mi=GetMI(); - FragColor=texture(TextureColor,vec3(Input.TexCoord,mi.id.x)); + FragColor=texture(TextureBaseColor,vec3(Input.TexCoord,mi.id.x)); } } diff --git a/ShaderLibrary/Std3D/BlinnPhong/SunLightPureColorTexture.mtl b/ShaderLibrary/Std3D/BlinnPhong/SunLightPureColorTexture.mtl new file mode 100644 index 00000000..6889a84c --- /dev/null +++ b/ShaderLibrary/Std3D/BlinnPhong/SunLightPureColorTexture.mtl @@ -0,0 +1,100 @@ +#Material +Name BlinnPhong+HalfLambert shading model only color +Reference https://zhuanlan.zhihu.com/p/442023993 +Base Std3D/BlinnPhong + +//某些Require并不真的存在.ubo文件,写成一行一个是为了方便未来改成带路径的 +Require LocalToWorld +Require Camera + +define HAVE_SPECULAR off //默认不定义HAVE_SPECULAR + +UBO +{ + File BlinnPhongSun.ubo //文件名,如果/开头表示从ShaderLibrary根目录开始,没有则表示同一目录 + Struct BlinnPhongSun //结构名称 + Name sun //在代码中的变量名 + Stage Fragment //会引用的shader + Set Global //Descriptor Set +} + +#MaterialInstance +Length 32 +Stage Fragment +Code +{ + vec4 Color; + uint tex_id; +} + +#VertexInput +vec3 Normal +vec2 TexCoord + +#Vertex +Output +{ + vec4 Position; + vec3 Normal; + vec2 TexCoord +} + +Code +{ + + void main() + { + Output.Normal =GetNormal(); + Output.Position =GetPosition3D(); + Output.TexCoord =TexCoord; + + HandoverMI(); + + gl_Position =Output.Position; + } +} + +#Fragment + +sampler2DArray TextureBaseColor + +Output +{ + vec4 FragColor; +} + +Code +{ + #define HAVE_SPECULAR + + void main() + { + MaterialInstance mi=GetMI(); + + vec4 texture_color=texture(TextureBaseColor,vec3(Input.TexCoord,mi.tex_id)); + + //点乘法线和光照 + float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5; + + //直接光颜色 + vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb*texture_color.rgb; + + #ifndef HAVE_SPECULAR + FragColor=vec4(direct_color,1.0); + #else + + vec3 spec_color=vec3(0.0); + + if(intensity>0.0) + { + vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos)); + + float specular=max(dot(half_vector,Input.Normal),0.0); + + spec_color=specular*pow(specular,8)*sun.color.rgb; + } + + FragColor=vec4(direct_color+spec_color,1.0); + #endif//HAVE_SPECULAR + } +} diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index 300dff56..478ca5c5 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -28,12 +28,26 @@ static mtl::blinnphong::SunLight sun_light= constexpr const COLOR AxisColor[4]= { - COLOR::Red, //X轴颜色 - COLOR::Green, //Y轴颜色 - COLOR::Blue, //Z轴颜色 + //COLOR::Red, //X轴颜色 + //COLOR::Green, //Y轴颜色 + //COLOR::Blue, //Z轴颜色 + COLOR::White, //全局颜色 + COLOR::White, //全局颜色 + COLOR::White, //全局颜色 COLOR::White //全局颜色 + }; +constexpr const os_char *tex_filename[]= +{ + OS_TEXT("eucalyptus-cross-versailles.Tex2D"), + OS_TEXT("tints-ashton-green-stretcher.Tex2D"), + OS_TEXT("worn-clay-cobble-in-desert-stretcher.Tex2D"), + OS_TEXT("plain-grey-sheer.Tex2D"), +}; + +constexpr const size_t TexCount=sizeof(tex_filename)/sizeof(os_char *); + class TestApp:public SceneAppFramework { private: //plane grid @@ -47,6 +61,10 @@ private: DeviceBuffer * ubo_sun =nullptr; + + Texture2DArray * texture =nullptr; + Sampler * sampler =nullptr; + private: //sphere Material * mtl_blinnphong =nullptr; @@ -61,6 +79,29 @@ private: //sphere Primitive * prim_cylinder =nullptr; private: + + bool InitTexture() + { + texture=db->CreateTexture2DArray( "SeamlessBackground", + 256,256, ///<纹理尺寸 + TexCount, ///<纹理层数 + PF_BC1_RGBUN, ///<纹理格式 + false); ///<是否自动产生mipmaps + + if(!texture)return(false); + + OSString filename; + + for(uint i=0;iLoadTexture2DToArray(texture,i,filename)) + return(false); + } + + return(true); + } bool InitVertexLumMP() { @@ -97,16 +138,32 @@ private: cfg.local_to_world=true; cfg.material_instance=true; - mtl_blinnphong=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColor",&cfg); + mtl_blinnphong=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColorTexture",&cfg); if(!mtl_blinnphong)return(false); mtl_blinnphong->BindUBO(DescriptorSetType::Global,"sun",ubo_sun); mtl_blinnphong->Update(); + + sampler=db->CreateSampler(); + + if(!mtl_blinnphong->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集 + mtl::SamplerName::BaseColor, ///<采样器名称 + texture, ///<纹理 + sampler)) ///<采样器 + return(false); + + struct MIData + { + Color4f color; + uint32 tex_id[4]; + }mi_data; + + constexpr const uint MIDataStride=sizeof(MIData); - Color4f mi_data; for(uint i=0;i<4;i++) { - mi_data=GetColor4f(AxisColor[i],4); + mi_data.color=GetColor4f(AxisColor[i],4); + mi_data.tex_id[0]=i; mi_blinnphong[i]=db->CreateMaterialInstance(mtl_blinnphong, //材质 nullptr, //顶点输入配置,这里使用nullptr,即代表会使用默认配置,那么结果将等同于上面的mtl_blinnphong->GetDefaultVIL() @@ -177,9 +234,9 @@ private: { struct CylinderCreateInfo cci; - cci.halfExtend =4; //圆柱一半高度 + cci.halfExtend =1.25; //圆柱一半高度 cci.numberSlices=16; //圆柱底部分割数 - cci.radius =0.25f; //圆柱半径 + cci.radius =1.25f; //圆柱半径 prim_cylinder=CreateCylinder(pc_blinnphong,&cci); } @@ -235,8 +292,11 @@ public: if(!SceneAppFramework::Init(w,h)) return(false); - if(!InitVertexLumMP()) + if(!InitTexture()) return(false); + + //if(!InitVertexLumMP()) + // return(false); if(!CreateBlinnPhongUBO()) return(false); diff --git a/inc/hgl/graph/mtl/SamplerName.h b/inc/hgl/graph/mtl/SamplerName.h index 32d2f2bd..7c6f70b1 100644 --- a/inc/hgl/graph/mtl/SamplerName.h +++ b/inc/hgl/graph/mtl/SamplerName.h @@ -8,7 +8,7 @@ namespace hgl { namespace SamplerName { - constexpr const char Color[] = "TextureColor"; + constexpr const char BaseColor[] = "TextureBaseColor"; }//namespace SamplerName }//namespace mtl }//namespace graph diff --git a/res b/res index 5e5814c1..475d8ad4 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 5e5814c15e936fd6e865c344b98f5ce79f364079 +Subproject commit 475d8ad43ceee084cd24f5d0bed59de9f6aa36fd diff --git a/src/ShaderGen/2d/M_PureTexture2D.cpp b/src/ShaderGen/2d/M_PureTexture2D.cpp index a1eaa570..ee07d285 100644 --- a/src/ShaderGen/2d/M_PureTexture2D.cpp +++ b/src/ShaderGen/2d/M_PureTexture2D.cpp @@ -45,7 +45,7 @@ void main() bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { - mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::Color); + mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::BaseColor); fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。 diff --git a/src/ShaderGen/2d/M_RectTexture2D.cpp b/src/ShaderGen/2d/M_RectTexture2D.cpp index caf91bbb..015c9cf8 100644 --- a/src/ShaderGen/2d/M_RectTexture2D.cpp +++ b/src/ShaderGen/2d/M_RectTexture2D.cpp @@ -72,7 +72,7 @@ void main() bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { - mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::Color); + mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::BaseColor); fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。 diff --git a/src/ShaderGen/2d/M_RectTexture2DArray.cpp b/src/ShaderGen/2d/M_RectTexture2DArray.cpp index 9bdc335b..6bd8d78d 100644 --- a/src/ShaderGen/2d/M_RectTexture2DArray.cpp +++ b/src/ShaderGen/2d/M_RectTexture2DArray.cpp @@ -79,7 +79,7 @@ void main() bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { - mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2DArray,mtl::SamplerName::Color); + mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2DArray,mtl::SamplerName::BaseColor); fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。