(参照例子DXSDK sample:DynamicShaderLinkage11)

一、preprocessor

实现shader静态分支的经典方法,代码示例如下

shader中(如果显卡不支持DX11,则STATIC_PERMUTE为True):

  1. #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,预定义列表。显然预定义改变,需重新编译):

  1. ...// 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相关推荐

  1. (转)跨越Opengl和D3D的鸿沟

    原帖地址: http://www.cnblogs.com/gongminmin/archive/2011/07/15/2107290.html 多年来,在论坛和各个网站上不断能看到拿OpenGL和D3 ...

  2. DirectX 11 编程指南

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 微软在2 ...

  3. NV GTX480对ATI HD5870:另一个视角

    自从NVIDIA的GTX480推出以来,网上能见到不少对比评测.但大家一般都是用3DMark之类大型的评测方法,得到的结果比较笼统.我在 这里打算评测的方法是用DX SDK Feb2010的sampl ...

  4. Compute Shader次世代优化方案

    这是侑虎科技第498篇文章,感谢作者凯奥斯供稿.欢迎转发分享,未经作者授权请勿转载.如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群:793972859) 作者主页:https://z ...

  5. DX11(零)-前言

    05/25/2020 游戏 DirectX 11是什么 如何查看windows电脑自带的DirectX的版本 Direct 3D的特点 渲染硬件层接口 (Render hardware interfa ...

  6. NV GTX680对GTX580:另一个视角

    转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/03/31/nv-gtx680%e5%af%b9gtx580%ef%bc%9a%e5%8f%a6% ...

  7. 虚幻引擎学习之路:渲染模块之光照系统

    原文链接:https://blog.uwa4d.com/archives/Study_unreal4_Rendering_1.html 写在前面 "UWA什么时候可以支持Unreal引擎?& ...

  8. DirectX11解析

    引言:随着Window 7操作系统的日益临近,DirectX 11也离我们不远了.日前,北美著名IT网站anandtech的资深编辑Derek Wilson为我们带来了一篇关于DirectX 11的分 ...

  9. Epic Games资深程序工程师王祢: 使用UE4制作VR内容的优化

    游戏兵工厂新闻报道: 11月21日下午,由蛮牛精心打造的开发者线下技术交流平台,第四届蛮牛杯思享汇系列活动(北京站)在金长安大厦圆满结束.来自蛮牛社区的游戏开发者.VR行业.游戏产业以及媒体记者等超1 ...

最新文章

  1. 编程将 .Net Assembly 里的类注册成 COM 类
  2. poj 1961 Period
  3. 网易云解码实时音视频社交 成就游戏产业发展新变量
  4. Todolist总结
  5. 2018/11/26
  6. linux之vim常见配置
  7. 香港2013迷你制汇节即将启幕
  8. mysql先排序再分组筛选_mysql 怎样先排序再分组
  9. 【Git】PyCharm项目关联Git的解决方案
  10. linux 测试本地端口是否打开,有效地测试Linux上的端口是否打开?
  11. Nginx面试题(总结最全面的面试题!!!)
  12. PDF文件转化成mobi格式,亲测kindle或者iReader可用!
  13. Unity 材质设置为tiling不能够重复的问题
  14. Camera问题解锁:Sensor Flicker(banding)
  15. 服务器端口不稳定怎么解决,网络不稳定的原因分析,以及解决方法
  16. Unity 半透明图片遮挡半透明图片
  17. 01-计算机网络术语中英文对照
  18. 营收净利双双“滑坡”,华米科技离“独立”还有多远?
  19. VIP_OSP--基于Thrift的RPC框架的基本原理
  20. hbase-default.xml file seems to be for an older version of HBase ,this version is 1.2.0

热门文章

  1. (1)学习数组,集合,IEnumerable接口,引申学习迭代器
  2. 排序算法 Java实现
  3. QTP的那些事---页面弹出框的处理,页面等待加载的处理
  4. 深入解析redis cluster gossip机制
  5. iOS开发之AVKit框架使用
  6. C2:抽象工厂 Abstract Factory
  7. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  8. UITableView模版
  9. [转] 程序员写简历的注意事项
  10. RGB与16进制颜色转换的原理