DX11 preprocessor Dynamic shader linkage
(参照例子DXSDK sample:DynamicShaderLinkage11)
一、preprocessor
实现shader静态分支的经典方法,代码示例如下
shader中(如果显卡不支持DX11,则STATIC_PERMUTE为True):
#if !defined( STATIC_PERMUTE )iBaseLight g_abstractAmbientLighting;...iBaseMaterial g_abstractMaterial; #else...#define g_abstractAmbientLighting g_ambientLight#define g_abstractDirectLighting g_directionalLight#define g_abstractEnvironmentLighting g_environmentLight#define g_abstractMaterial g_plasticMaterial #endif
App中(D3DX11CompileFromFile的第二个参数就是D3D10_SHADER_MACRO *pDefines,预定义列表。显然预定义改变,需重新编译):
...// Compile the shader using optional defines and an include handler for header processingstatic const D3D_SHADER_MACRO Shader_Macros[] = { "STATIC_PERMUTE", "1", NULL, NULL };ID3DBlob* pErrorBlob;hr = D3DX11CompileFromFile( szFileName, &Shader_Macros[0], pIncludeHandler, szEntryPoint, szShaderModel,flags, 0, NULL, ppBlobOut, &pErrorBlob, NULL );...
二、Dynamic Shader Linkage
在shader实现OO框架,当场景渲染时,动态指定父类指针实际子类实例。
shader中:
//--------------------------------------------------------------------------------------// Interfaces//--------------------------------------------------------------------------------------interface iBaseMaterial {float3 GetAmbientColor(float2 vTexcoord);float3 GetDiffuseColor(float2 vTexcoord);int GetSpecularPower();};//--------------------------------------------------------------------------------------// Classes//--------------------------------------------------------------------------------------class cBaseMaterial : iBaseMaterial {float3 m_vColor; int m_iSpecPower;float3 GetAmbientColor(float2 vTexcoord) { return m_vColor; }float3 GetDiffuseColor(float2 vTexcoord) { return (float3)m_vColor; }int GetSpecularPower() { return m_iSpecPower; }};class cPlasticMaterial : cBaseMaterial { };class cPlasticTexturedMaterial : cPlasticMaterial { ... };class cPlasticLightingOnlyMaterial : cBaseMaterial { ... }cbuffer cbPerPrimitive : register( b1 ) {cPlasticMaterial g_plasticMaterial;cPlasticTexturedMaterial g_plasticTexturedMaterial;...};...float4 PSMain( PS_INPUT Input ) : SV_TARGET { // Compute the Ambient termfloat3 Ambient = (float3)0.0f; Ambient = g_abstractMaterial.GetAmbientColor( Input.vTexcoord ) * g_abstractAmbientLighting.IlluminateAmbient( Input.vNormal );...float3 Lighting = saturate( Ambient + Diffuse + Specular );return float4(Lighting,1.0f);}
App中:
设置shader中声明的Interface的具体子类实例。
// 初始化阶段, 相当于初始化shader中各interface子类实例ID3D11ClassLinkage* g_pPSClassLinkage= NULL; struct CB_PS_PER_PRIMITIVE {D3DXVECTOR4 m_vObjectColorPlastic; // Plastic -.w is Specular PowerD3DXVECTOR4 m_vObjectColorPlasticTextured; // Plastic -.w is Specular Power ...};// Material Dynamic Permutationenum E_MATERIAL_TYPES {MATERIAL_PLASTIC,...MATERIAL_ROUGH,...MATERIAL_TYPE_COUNT};char* g_pMaterialClassNames[ MATERIAL_TYPE_COUNT ] = {"g_plasticMaterial", // cPlasticMaterial "g_plasticTexturedMaterial", // cPlasticTexturedMaterial ... };E_MATERIAL_TYPES g_iMaterial = MATERIAL_PLASTIC_TEXTURED;ID3D11ClassInstance* g_pMaterialClasses[ MATERIAL_TYPE_COUNT ] = { NULL };UINT g_iMaterialOffset = 0;ID3D11ClassInstance** g_dynamicLinkageArray = NULL;V_RETURN( pd3dDevice->CreateClassLinkage( &g_pPSClassLinkage ) );...V_RETURN( pd3dDevice->CreatePixelShader( pPixelShaderBuffer->GetBufferPointer(),pPixelShaderBuffer->GetBufferSize(), g_pPSClassLinkage, &g_pPixelShader ) );...// use shader reflection to get data locations for the interface arrayID3D11ShaderReflection* pReflector = NULL;V_RETURN( D3DReflect( pPixelShaderBuffer->GetBufferPointer(), pPixelShaderBuffer->GetBufferSize(),IID_ID3D11ShaderReflection, (void**) &pReflector) );g_iNumPSInterfaces = pReflector->GetNumInterfaceSlots();// shader中所有的interface指针构成的列表g_dynamicLinkageArray = (ID3D11ClassInstance**) malloc( sizeof(ID3D11ClassInstance*) * g_iNumPSInterfaces );if (g_dynamicLinkageArray == NULL)return E_FAIL;...ID3D11ShaderReflectionVariable* pMaterialVar = pReflector->GetVariableByName("g_abstractMaterial");int g_iMaterialOffset = pMaterialVar->GetInterfaceSlot(0);...// Acquire the material Class Instances for all possible material settingsfor( UINT i=0; i < MATERIAL_TYPE_COUNT; i++) {g_pPSClassLinkage->GetClassInstance( g_pMaterialClassNames[i], 0, &g_pMaterialClasses[i] ); //声明shader中各ClassInstance } ...// FrameRender阶段switch( g_iMaterial ) { // 与界面控件绑定,指定interface指针实际子类实例case MATERIAL_PLASTIC:case MATERIAL_PLASTIC_TEXTURED: { ...g_dynamicLinkageArray[g_iMaterialOffset] = g_pMaterialClasses[ g_iMaterial ] ;}case MATERIAL_ROUGH:case MATERIAL_ROUGH_TEXTURED: {...g_dynamicLinkageArray[g_iMaterialOffset] = g_pMaterialClasses[ g_iMaterial ] ;}}...// PS Per Prim。初始化各实例中的成员变量,每个实例成员变量大小为Float4,即shader中的 (float3 m_vColor; int m_iSpecPower)int iSpecPower = 128;V( pd3dImmediateContext->Map( g_pcbPSPerPrim, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) );CB_PS_PER_PRIMITIVE* pPSPerPrim = ( CB_PS_PER_PRIMITIVE* )MappedResource.pData;...pPSPerPrim->m_vObjectColorPlasticTextured = D3DXVECTOR4( 1, 0, 0.5, 0 ); // Shiny Plastic with Texturesmemcpy( &(pPSPerPrim->m_vObjectColorPlasticTextured.w), &iSpecPower, sizeof(int));...iSpecPower = 6;pPSPerPrim->m_vObjectColorRoughTextured = D3DXVECTOR4( 0, .5, 1, 0 ); // Rough Material with Texturesmemcpy( &(pPSPerPrim->m_vObjectColorRoughTextured.w), &iSpecPower, sizeof(int));...pd3dImmediateContext->Unmap( g_pcbPSPerPrim, 0 );pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerPrimBind, 1, &g_pcbPSPerPrim );
转载于:https://www.cnblogs.com/ActionFG/archive/2012/09/09/2677471.html
DX11 preprocessor Dynamic shader linkage相关推荐
- (转)跨越Opengl和D3D的鸿沟
原帖地址: http://www.cnblogs.com/gongminmin/archive/2011/07/15/2107290.html 多年来,在论坛和各个网站上不断能看到拿OpenGL和D3 ...
- DirectX 11 编程指南
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 微软在2 ...
- NV GTX480对ATI HD5870:另一个视角
自从NVIDIA的GTX480推出以来,网上能见到不少对比评测.但大家一般都是用3DMark之类大型的评测方法,得到的结果比较笼统.我在 这里打算评测的方法是用DX SDK Feb2010的sampl ...
- Compute Shader次世代优化方案
这是侑虎科技第498篇文章,感谢作者凯奥斯供稿.欢迎转发分享,未经作者授权请勿转载.如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群:793972859) 作者主页:https://z ...
- DX11(零)-前言
05/25/2020 游戏 DirectX 11是什么 如何查看windows电脑自带的DirectX的版本 Direct 3D的特点 渲染硬件层接口 (Render hardware interfa ...
- NV GTX680对GTX580:另一个视角
转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/03/31/nv-gtx680%e5%af%b9gtx580%ef%bc%9a%e5%8f%a6% ...
- 虚幻引擎学习之路:渲染模块之光照系统
原文链接:https://blog.uwa4d.com/archives/Study_unreal4_Rendering_1.html 写在前面 "UWA什么时候可以支持Unreal引擎?& ...
- DirectX11解析
引言:随着Window 7操作系统的日益临近,DirectX 11也离我们不远了.日前,北美著名IT网站anandtech的资深编辑Derek Wilson为我们带来了一篇关于DirectX 11的分 ...
- Epic Games资深程序工程师王祢: 使用UE4制作VR内容的优化
游戏兵工厂新闻报道: 11月21日下午,由蛮牛精心打造的开发者线下技术交流平台,第四届蛮牛杯思享汇系列活动(北京站)在金长安大厦圆满结束.来自蛮牛社区的游戏开发者.VR行业.游戏产业以及媒体记者等超1 ...
最新文章
- 编程将 .Net Assembly 里的类注册成 COM 类
- poj 1961 Period
- 网易云解码实时音视频社交 成就游戏产业发展新变量
- Todolist总结
- 2018/11/26
- linux之vim常见配置
- 香港2013迷你制汇节即将启幕
- mysql先排序再分组筛选_mysql 怎样先排序再分组
- 【Git】PyCharm项目关联Git的解决方案
- linux 测试本地端口是否打开,有效地测试Linux上的端口是否打开?
- Nginx面试题(总结最全面的面试题!!!)
- PDF文件转化成mobi格式,亲测kindle或者iReader可用!
- Unity 材质设置为tiling不能够重复的问题
- Camera问题解锁:Sensor Flicker(banding)
- 服务器端口不稳定怎么解决,网络不稳定的原因分析,以及解决方法
- Unity 半透明图片遮挡半透明图片
- 01-计算机网络术语中英文对照
- 营收净利双双“滑坡”,华米科技离“独立”还有多远?
- VIP_OSP--基于Thrift的RPC框架的基本原理
- hbase-default.xml file seems to be for an older version of HBase ,this version is 1.2.0