Direct3D中的Shader是这样的:

1. ASM Shader是最元老的也是DX8主要使用Shader

2. fxc编译器可以同时编译ASM,HLSL和fx脚本,其中HLSL和fx可以查看编译后的GPU汇编代码

3. D3D9中,fx是HLSL的一种渲染脚本,简化了HLSL设置及常量绑定,并且附带RenderStateBlock及设置

但只能用于制作简单的Shader

4. DirectXSDK中有一个概念混淆:C++例子中的BasicHLSL使用的其实还是fx,HLSLwithoutEffects例子才是真正的纯HLSL

5.fx与HLSL程序鉴别:

使用fx程序必定含有:D3DXCreateEffectXXX 系列函数, ID3DXEffect对象,渲染中能看到SetTechnique,BeginPass,EndPass之类的字眼

使用纯HLSL程序含有:D3DXCompileShader,ID3DXConstantTable对象,GetConstantByName,GetConstantDesc之类的字眼

6. 在fx中包含有 VertexShader,PixelShader代码及profile,entry,RenderState设置及简单的绘制过程(pass)。一次编译后,VS,PS,Texture,Sampler及常量都是在ID3DXEffect对象中自动完成,无需手动设置。

7. HLSL可以将VS及PS代码写入1个.hlsl文件。注意,以下这种代码可以在HLSL中编译过,但实际没有任何效果

   1:  sampler_state
   2:  {
   3:      Texture = <tex>;
   4:      MipFilter = LINEAR;
   5:      MinFilter = LINEAR;
   6:      MagFilter = LINEAR;
   7:  };

这点可以参考AMD RenderMonkey中只在shader中使用sampler而忽略texture。

8. fx中往shader设置纹理使用的是ID3DXBaseEffect::SetTexture下的这个函数

   1:  HRESULT SetTexture(
   2:    D3DXHANDLE hParameter,
   3:    LPDIRECT3DBASETEXTURE9 pTexture
   4:  );

但是在HLSL中,这点就变得很麻烦,需要手动设置,可以参考这篇文章

Shader代码片段:

   1:  sampler Samp0 = sampler_state
   2:  {
   3:      Texture = <Tex0>;
   4:      MipFilter = LINEAR;
   5:      MinFilter = LINEAR;
   6:      MagFilter = LINEAR;
   7:  };

编译HLSL代码后得到ConstantTable,然后取出句柄:

   1:  ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");
   2:   
   3:  Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");
   4:   
   5:  Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1");

再从句柄取出symbol的描述:

   1:  UINT count;
   2:   
   3:  pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);
   4:   
   5:  pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);

通过上面的描述,将纹理变量的寄存器偏移作为纹理的stage

8.  优化常量设置速度的方法一般就是根据字符串取出句柄,以后每次渲染时,只通过句柄设置。但ID3DXConstantTable最后还是通过

IDirect3DDevice9::SetPixelShaderConstantX 系列函数来实现的

   1:  HRESULT SetPixelShaderConstantF(
   2:    UINT StartRegister,
   3:    CONST float * pConstantData,
   4:    UINT Vector4fCount
   5:  );

9. HLSL将一段包含VS和PS代码编译完成后,将得到VS和PS两个单独的ID3DXConstantTable

Direct3D9 Fx/HLSL的若干条有用的笔记相关推荐

  1. Android项目笔记整理(1)

    第二部分 工作项目中以及平时看视频.看书或者看博客时整理的个人觉得挺有用的笔记 1.Activity界面切换:    if(条件1){         setContentView(R.layout. ...

  2. 1.2什么是HLSL

    1.2什么是HLSL Direct8.x中,着色器是通过低级着色汇编语言来编写的,这样的程序更像是汇编式的指令集合,由于其效率低.可读性差.版本限制等缺点,迫切要求出现一门更高级的着色语言.到了Dir ...

  3. ggplot2学习笔记7:通过图层逐层构建图形

    Build a Plot Layer by Layer 5.1 介绍(Introduction) ggplot2背后的一个关键思想是,它允许轻松地迭代,一次一层地构建一个复杂的绘图.每个图层可以来自不 ...

  4. 《脑力赋能》读书笔记

    https://book.douban.com/subject/34855932/ 评语: 比较浅显的入门书,快速阅读完毕,有些小练习不错 有用的笔记: 1) 练习:渐进放松 1. 在椅子上坐好,双脚 ...

  5. linux离线安装redmine_9 款 Linux 上的最佳笔记应用 | Linux 中国

    无论你做什么,做笔记总是一个好习惯.https://linux.cn/article-12307-1.html作者:Ankush Das译者:Xingyu.Wang 无论你做什么,做笔记总是一个好习惯 ...

  6. sqlserver linux 付费吗_9 款 Linux 上的最佳笔记应用 | Linux 中国

    无论你做什么,做笔记总是一个好习惯. 来源:https://linux.cn/article-12307-1.html 作者:Ankush Das 译者:Xingyu.Wang 无论你做什么,做笔记总 ...

  7. 【电子笔记软件推荐】

    最近搜罗了一些笔记软件,我自己稍微总结了一下,虽然讲道理笔记软件不是最重要的,真的整理好自己的知识和形成体系才是最重要的,哎,我就是懒,就先挑不用脑子的事情做,摸鱼... 1.本地笔记本 看了很多人的 ...

  8. matlab视觉呈现任务,视觉笔记 | 国内外优秀作品解读赏析(1)

    嗨大家好,欢迎来到我们每周视觉笔记解读赏析栏目. 作为视觉呈现者,眼界是决定你能力的上限,好的作品能够刺激我们持续的画图的动力.下面为大家分享3种不同风格的视觉笔记,并简单解读. 看别人的作品,寻找自 ...

  9. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

最新文章

  1. 某大厂程序员吐槽:在北京当码农,不敢结婚不敢生娃,真是注孤生!
  2. 使用sqlite3解决IDEA中SVN更新提示cleanup却无法cleanup的问题
  3. 利用HTML5 canvas合并图片并解决Filaed to execute 'toDataURL' on 'HTMLCanvasElement'异常
  4. initialization of 'XXX' is skipped by 'case' label
  5. SecureCRT同时向多个终端发送命令
  6. [php] in_array 判断问题(坑)
  7. HTML音乐播放没声音,网页没有声音但系统显示有声音怎么回事?如何解决?
  8. php中cnum函数,PHP vprintf() 函数
  9. IIS 服务器下载apk文件报404错
  10. 紧追SpaceX,又一星际飞船明年4月要首次载人飞行
  11. pfx导入后仍然打不开加密文件_天正CAD图纸加密和解密方法
  12. python:configparser模块
  13. mysql数据库集群版_MySQL数据库集群实战
  14. 计算机应用基础陈江鸿,广播电视大学计算机教育改革探索与实践-计算机教育论文-计算机论文(6页)-原创力文档...
  15. 重新挂载磁盘mysql重新建表_Linux重新挂载磁盘
  16. Excel表的标题栏锁定
  17. 记一次修复Mac和Win7双系统启动菜单的经历
  18. 小米5之Root攻略
  19. docker容器不阻塞的进入
  20. D3.js v5.0 旭日图

热门文章

  1. 如何迁移outlook邮件到另一个硬盘_猎头如何有效的搜寻与筛选简历
  2. python 元组与数组的区别_python – NumPy – 从元组到数组的高效转换?
  3. cassandra随机获取数据_Cassandra维护最终一致性 和存储机制 分区策略
  4. 二进制转换 html,javascript 处理回传的二进制图像并显示在html上
  5. android内存置换,课内资源 - 基于Android实现的页面置换模拟
  6. 少儿是先学计算机 还是学机器人,机器人学习和少儿编程有什么区别?
  7. teamviewer11 android,teamviewer安卓最新版本
  8. linux目录详解i-node,i-node节点与链接
  9. Java讲课笔记07:计数循环与嵌套循环
  10. 安卓案例:基于HttpClient下载文本与图片