当前位置: 首页 > 编程日记 > 正文

DX11 preprocessor Dynamic shader linkage

(参照例子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

相关文章:

OpenCV中与matlab中相对应的函数

1、matlab中的imread相当于OpenCV中的cvLoadImage(imageName, CV_LOAD_IAMGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR)&#xff1a;读出的图像信息保持了原有图像的信息(包括通道信息和位深信息)&#xff1b; rgb2gray相当于cvLoadImage(imageName, CV_LOAD_IMAGE_GRAYSCALE)&…

AI假新闻满天飞,打假神器GROVER帮你看清一切

最近AI换脸术与AI假新闻叠加在一起&#xff0c;造成了不少乌龙事件&#xff0c;比如最近美国的议长南希佩洛西就的一段醉酒视频就在Facebook上流传甚广&#xff0c;视频中的议长明显是状态晕沉&#xff0c;醉意十足&#xff0c;不过这后来被证明是一段是由deepfake生成的假视频…

NYOJ 93

汉诺塔&#xff08;三&#xff09; 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述在印度&#xff0c;有这么一个古老的传说&#xff1a;在世界中心贝拿勒斯&#xff08;在印度北部&#xff09;的圣庙里&#xff0c;一块黄铜板上插着三根宝…

C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结

转自&#xff1a;http://blog.163.com/tianhityeah/blog/static/165747821201052195212719/ #include<iostream>using namespace std;int fun(int a[][3],int n) // 其中二维数组形参必须确定数组的第二维的长度&#xff0c;第一维长度可以不定//int fun(int (*a)[…

打破欧美垄断,国防科大斩获“航天界奥林匹克”大赛首冠

整理 | Jane责编 | 一一出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;近日&#xff0c;第十届国际空间轨道设计大赛&#xff08;GTOC X&#xff09;结束并公布最终成绩&#xff0c;中国参赛队国防科技大学与西安卫星测控中心联队&#xff08;NUDT&X…

Hive 中的变量

Hive的变量前面有一个命名空间&#xff0c;包括三个hiveconf&#xff0c;system&#xff0c;env&#xff0c;还有一个hivevar hiveconf的命名空间指的是hive-site.xml下面的配置变量值。system的命名空间是系统的变量&#xff0c;包括JVM的运行环境。env的命名空间&#xff0c;…

你必须非常努力,才能看起来毫不费力

有一群人&#xff0c;他们积极自律&#xff0c;每天按计划行事&#xff0c;有条不紊&#xff1b;他们不张扬&#xff0c;把自己当成最卑微的小草&#xff0c;等待着人生开出花朵的那天。他们早晨5点多起来健身&#xff0c;你在睡觉&#xff1b;7点开始享受丰盛的早餐&#xff0…

cvGetSubRect与cvMul用法

1、对于cvGetSubRect(mat1, mat2, rect)&#xff0c;当用cvGetSubRect函数时&#xff0c;不能事先对mat2申请内存&#xff0c;否则会产生内存泄漏。 只要这样定义mat2即可&#xff1a;CvMat *mat2; mat2 cvCreateMatHeader(imgHeight, imgWidth, CV_64FC1); 2、对于cvGetSubR…

浅谈WPF的VisualBrush

原文:浅谈WPF的VisualBrush首先看看VisualBrush的解释&#xff0c;msdn上面的解释是使用 Visual 绘制区域&#xff0c;那么我们再来看看什么是Visual呢&#xff1f;官方的解释是&#xff1a;获取或设置画笔的内容&#xff0c;Visual 是直接继承自DependencyObject&#xff0c;U…

AI换脸技术再创新高度,DeepMind发布的VQ-VAE二代算法有多厉害?

作者 | beyondma转载自CSDN网站近日DeepMind发布VQ-VAE-2算法&#xff0c;也就是之前VQ-VAE算法2代&#xff0c;这个算法从感观效果上来看比生成对抗神经网络&#xff08;GAN)的来得更加真实&#xff0c;堪称AI换脸界的大杀器&#xff0c;如果我不说&#xff0c;相信读者也很难…

cisco设备常用命令

router> enable 从用户模式进入特权模式 router# disable or exit 从特权模式退出到用户模式router# show sessions 查看本机上的TELNET会话router# disconnect …

opencv图像处理梯度边缘和角点

转自&#xff1a;http://blog.sina.com.cn/s/blog_4b9b714a0100c9f7.html 梯度、边缘和角点 Sobel 使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分 void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size3 ); src 输入图像. dst …

性能全面超数据库专家,腾讯提基于机器学习的性能优化系统 | SIGMOD 2019

腾讯与华中科技大学合作的最新研究成果入选了国际数据库顶级会议SIGMOD的收录论文&#xff0c;并将于6月30日在荷兰阿姆斯特丹召开SIGMOD 2019国际会议上公开发表。入选论文的题目为“An End-to-End Automatic Cloud Database Tuning System Using Deep Reinforcement Learning…

swift 语言评价

杂而不精&#xff0c;一团乱麻&#xff01;模式乱套&#xff0c;不适合作为一门学习和研究语言。 谢谢 LZ 介绍&#xff0c;看完之后更不想用 Swift 了。从 C那里抄个 V-Table 来很先进嘛&#xff1f;别跟 C一样搞什么 STL 就好了&#xff0c;整这么复杂&#xff0c;入个门都需…

Creative Web Typography Styles | Codrops

Creative Web Typography Styles | Codrops. 非常好的文字效果

OpenCV 图像采样 插值 几何变换

转自&#xff1a;http://hi.baidu.com/xiaoduo170/blog/item/6eefc612c9f8e9c6c2fd786f.html InitLineIterator 初始化线段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity8 ); image 带采…

centos 6.* 修改时间

一、查看Centos的时区和时间 1、使用date命令查看Centos时区 [rootVM_centos ~]# date -R Mon, 26 Mar 2018 19:14:03 0800 2、查看clock系统配置文件 [rootVM_centos ~]# cat /etc/sysconfig/clock ZONE"Asia/Shanghai" 3、查看系统的硬件时间&#xff0c;即BIOS时间…

别光发Paper,搞点实际问题

文 / LVS话说几个月前&#xff0c;我参加了一场学术大会&#xff0c;台上的教授不是北大、清华就是浙大、上交大&#xff0c;几位教授不约而同的吐槽招通信、算法和编解码的学生太难了。为什么呢&#xff1f;原来&#xff0c;先不比金融&#xff0c;仅仅与同是IT领域的AI专业就…

spring mvc文件上传小例子

spring mvc文件上传小例子 1.jsp页面 <%page contentType"text/html;charsetUTF-8"%> <%page pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%> <% taglib prefix"fmt…

解密Kernel:为什么适用任何机器学习算法?

作者 | Marin Vlastelica Pogančić译者 | 陆离编辑 | 一一出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;机器学习中Kernel的秘密&#xff08;一&#xff09;本文探讨的不是关于深度学习方面的&#xff0c;但可能也会涉及一点儿&#xff0c;主要是因为…

03-Java的基础语法

一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&…

图像处理-仿射变换 AffineTransform

转自&#xff1a;http://fairywangyutang.blog.sohu.com/146834554.html AffineTransform类描述了一种二维仿射变换的功能&#xff0c;它是一种二维坐标到二维坐标之间的线性变换&#xff0c;保持二维图形的“平直性”&#xff08;译注&#xff1a;straightness&#xff0c;即变…

以前初学php用的分页函数

page.php <?php /* *http://www.iiwnet.com/php/ PHP学习 * */ function _PAGEFT($totle, $displaypg 20, $url ) { global $page, $firstcount, $pagenav, $_SERVER; $GLOBALS["displaypg"] $displaypg; if (!$page) $page 1; if (!$url) { $url $_SERVER[…

深度有趣 | 27 服饰关键点定位

简介 介绍如何使用CPM&#xff08;Convolutional Pose Machines&#xff09;实现服饰关键点定位 原理 关键点定位是一类常见而有用的任务&#xff0c;某种意义上可以理解为一种特征工程 人脸关键点定位&#xff0c;可用于人脸识别、表情识别人体骨骼关键点定位&#xff0c;可用…

有答案了!一张图告诉你到底学Python还是Java!你咋看?

2019年&#xff0c;该学Java还是Python&#xff1f;不&#xff0c;实际上应该这样问&#xff1a;都9102年了&#xff0c;难道有谁不想成为Python程序员吗&#xff1f;作为“常青树大佬”Java 和“新晋大佬”Python &#xff0c;经常被人拿来对比&#xff0c;对于刚开始起步学习…

图像二值化----otsu(最大类间方差法、大津算法)(二)

转自&#xff1a;http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法&#xff0c;有时也称之为大津算法&#xff0c;被认为是图像分割中阈值选取的最佳算法&#xff0c;计算简单&#xff0c;不受图像亮度和对比度的影响&#xff0c;因此在数字图…

android同时使用多个library时的问题

剧情是这样&#xff0c;我的app要使用两个library&#xff0c;如&#xff1a;LibraryA&#xff0c;LibraryB。这两个库又都需要support.v4.jar。 由于加载的时间不同&#xff0c;所以两个support.v4.jar不同&#xff0c;出错的提示如下&#xff1a; [2012-09-28 16:37:22 - ] F…

C#版 - Leetcode49 - 字母异位词分组 - 题解

C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交:https://leetcode.com/problems/group-anagrams/ 题目描述 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: [&quo…

来学习几个简单的Hive函数吧!

作者 | 石晓文转载自小小挖掘机&#xff08;ID:wAIsjwj&#xff09;咳咳&#xff0c;今天来介绍一下几个Hive函数吧&#xff0c;先放一张我登哥划水的照片&#xff0c;希望大家也做一只自由的鱼儿&#xff0c;在知识的海洋里游呀游&#xff0c;嘻嘻&#xff01;今天我们来介绍几…

OpenCV编程案例:使用轮廓函数检测连通区域

转自&#xff1a;http://www.aiseminar.cn/bbs/thread-617-1-1.html 此案例位于CXCORE中cvDrawContours函数介绍部分给出。此程序首先载入一个二值图像文件&#xff0c;然后使用函数再次二值化确认。接着使用cvFindContours找到轮廓&#xff0c;然后使用填充方式绘制轮廓线内部…