一次只有一个vertex shader是活跃的。你可以有多个vertex shader,如果一个物体特殊的变换或者灯光,你可以选择合适的vertex shader来完成这个任务。

你可能想使用vertex shaders在每个物体或每个网格上,例如,十个网格,你可以使用十个不同的vertex shader,但那样可能会harm你的游戏的运行。

每个vertex shader-driven程序必须通过下面的步骤运行:

1。检查你的设备是否支持vertex shader。 (在direct X9以后已经不需要了)

2。用D3DVSD_* 宏声明vertex shader,用于将顶点缓冲(vertex buffer streams)映射(map)到输入寄存器(input register)。

3。用SetVertexShaderConstant()设置顶点着色器的常量寄存器。

4。用D3DXAssembleShader*()编译事先写的顶点着色器。

5。用CreateVertexShader()创建一个顶点着色器句柄。

6。用SetVertexShader()为一个要特效化的物体设置顶点着色器。

7。用DeleteVertexShader()删除顶点着色器。

由于第一步在directX 9以后就不需要了,所以这里省略它。

以下实现均对应于上述步骤。

---------------------------------------------------------------------------------------------------------------------------------------------------------------

2。声明顶点着色器。

在使用一个顶点着色器之前必须声明它。这个声明可以被称作一个静态的外部接口。

 float c[] = {0.0f,0.5f,1.0f,2.0f};
DWORD dwDesc10[] = {
D3DVSD_STREAM(),
D3DVSD_REG(,D3DVSDT_FLOAT3), //input register v0
D3DVSD_REG(,D3DVSDT_D3DCOLOR), //input register v5 // set a few constants
D3DVSD_CONST(,),
*(DWORD*)&c[],
*(DWORD*)&c[],
*(DWORD*)&c[],
*(DWORD*)&c[],
D3DVSD_END()
};

这个顶点着色器声明用D3DVSD_STREAM(0)设置数据流0。之后,通过使用这个声明,SetStreamSource()绑定一个顶点缓冲区到设备数据流。

你必须声明哪一个输入顶点属性或输入顶点数据被映射到哪一个输入寄存器。D3DVSD_REG从顶点流中绑定一个单个的顶点寄存器到一个顶点元素。在我们这个声明的例子中,D3DVSD_FLOAT3值应该被放在第一个输入寄存器,而D3DVSD_D3DCOLOR颜色值应该被放在第六个输入寄存器。例如,位置数据可以被输入寄存器0(v0)用D3DVSD_REG(0,D3DVSDT_FLOAT3)处理,法线数据可以被输入寄存器3(v3)用D3DVSD_REG(3,D3DVSDT_FLOAT3)处理。

注意,除非你想使用N-Patches,这需要位置数据在v0,法线数据在v3,否则,开发者可以自由定义顶点数据输入到的寄存器的映射。

相比之下,在固定管线中,顶点数据输入到特定寄存器的映射是固定的。

D3DVSD_CONST将常量值载入到顶点着色器的常量寄存器。第一个参数是常量数组开始填充数据的开始位置,可能的值范围是0-95(in the case of the RADEON 8500, from 0-191.)我们在0处开始。第二个参数是要载入的常量向量的数目,如果你要载入一个4x4矩阵(也就是4个向量),可以如下载入:

 float c[] = (0.0f, 0.5f, 1.0f, 2.0f,
0.0f, 0.5f, 1.0f, 2.0f,
0.0f, 0.5f, 1.0f, 2.0f,
0.0f, 0.5f, 1.0f, 2.0f);
D3DVSD_CONST(, ), *(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],
*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],
*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],
*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],*(DWORD*)&c[],

D3DVSD_END生成一个END,标志顶点着色器的结束。

 D3DVSD_END()

3。SetVertexShaderConstant() 设置顶点着色器常量寄存器

你可以用SetVertexShaderConstant()填充顶点着色器常量寄存器,用GetVertexShaderConstant()得到这些寄存器中的值。

SetVertexShaderConstant()的声明如下:

HRESULT SetVertexShaderConstant(
DWORD Register,
CONST void* pConstantData,
DWORD ConstantCount);

设置顶点着色器常量:

m_pd3dDevice->SetVertexShaderConstant( , &vZero,  );
m_pd3dDevice->SetVertexShaderConstant( , &vOne, );
m_pd3dDevice->SetVertexShaderConstant( , &vWeight, );
m_pd3dDevice->SetVertexShaderConstant( , &matTranspose, );
m_pd3dDevice->SetVertexShaderConstant( , &matCameraTranspose, );
m_pd3dDevice->SetVertexShaderConstant( , &matViewTranspose, );
m_pd3dDevice->SetVertexShaderConstant( , &fLight, );
m_pd3dDevice->SetVertexShaderConstant( , &fDiffuse, );
m_pd3dDevice->SetVertexShaderConstant( , &fAmbient, );
m_pd3dDevice->SetVertexShaderConstant( , &fFog, );
m_pd3dDevice->SetVertexShaderConstant( , &fCaustics, );
m_pd3dDevice->SetVertexShaderConstant( , &matProjTranspose, );
  如之前所述,至少有96个常量寄存器可以被填充。SetVertexShaderConstant()第一个参数为寄存器的索引,最后一个参数为常量的数目。比如,matViewTranspose将被载入到
寄存器12,载入数目为4个,寄存器16-19未被使用,fLight被载入到寄存器20,载入数目为1.
那么 ,用在着色器声明中的D3DVSD_CONST和SetVertexShaderConstant()有什么不同呢?
D3DVSD_CONST只能是用仅仅一次,而SetVertexShaderConstant()可以在每次DrawPrimitive*()之前调用。

待续.....

vertex shader(2)的更多相关文章

  1. vertex shader(4)

    Swizzling and Masking 如果你使用输入.常量.临时寄存器作为源寄存器,你可以彼此独立地swizzle .x,.y,.z,.w值.如果你使用输出.临时寄存器作为目标寄存器,你可以把. ...

  2. vertex shader(3)

    之前我们学习了如何声明顶点着色器.如何设置常量寄存器中的常量.接下来我们学习如何写和编译一个顶点着色器程序. 在我们编译一个顶点着色器之前,首先需要写一个. 有17种不同的指令(instruction ...

  3. vertex shader(1)

    Vertex shader Architecture: 所有在vertex shader中的数据都用128-bit的quad-floats表示(4x32-bit). vertex shader线性地执 ...

  4. 【Unity Shader实战】卡通风格的Shader(二)

    写在前面 本系列其他文章: 卡通风格的Shader(一) 好久没写博客了,一定是因为课程作业比较多,一定不是因为我懒,恩恩. 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface ...

  5. 【Unity Shader实战】卡通风格的Shader(一)

    写在前面 本系列其他文章: 卡通风格的Shader(二) 呜,其实很早就看到了这类Shader,实现方法很多,效果也有些许不一样.从这篇开始,陆续学习一下接触到的卡通类型Shader的编写. 本篇的最 ...

  6. 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)

    1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...

  7. 基于Cocos2d-x学习OpenGL ES 2.0系列——编写自己的shader(2)

    在上篇文章中,我给大家介绍了如何在Cocos2d-x里面绘制一个三角形,当时我们使用的是Cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时, ...

  8. Unity Shader (三)Surface Shader机制

    转自:http://blog.csdn.net/candycat1992/article/details/39994049 写在前面 一直以来,Unity Surface Shader背后的机制一直是 ...

  9. Unity Shader (一)ShaderLab 语法

    一.什么是Shader Shader(着色器):是可以在GPU上运行的一段程序,通过Shader可以进行一些渲染相关的设置. 二.什么是ShaderLab 目前面向GPU的编程有三种高级图像语言:HL ...

随机推荐

  1. CF1114F Please, another Queries on Array?

    CF1114F Please, another Queries on Array? 考虑用线段树维护取模后的区间积和真正的区间积所含有的质因子. 每次询问查得这两个值后,一乘一除,即可算出该区间积的欧 ...

  2. BZOJ3673 可持久化并查集 by zky 【主席树】

    BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...

  3. 【DUBBO】Dubbo原理解析-Dubbo内核实现之SPI简单介绍

    Dubbo采用微内核+ 插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系是如何实现的呢!大家是否熟悉spi(service providerinterface)机制,即我们定义了服务接口标准 ...

  4. 远程复制数据免登录 rsync 和 scp

    一.备用机上(用于存放备份的机器)  和 目标机上(需要备份的服务器 ,如 246) 都需要安装 :   yum install -y rsync 二.备用机上运行命令: -t rsa Generat ...

  5. Hadoop序列化与Writable接口(一)

    Hadoop序列化与Writable接口(一) 序列化 序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储:相对的反序列化(deserial ...

  6. JDBC 流程

    转载地址:https://blog.csdn.net/suwu150/article/details/52744952 JDBC编程的六个步骤:    准备工作中导入ojdbc文件,然后右键选中添加路 ...

  7. 编译Lichee(FridenlyARM NanoPi-M1)碰到的问题及解决办法

    1. 提示libz.so.1找不到 需要在ubuntu上安装下面两个包: sudo apt-get install lib32ncurses5 ia32-libs 2. 提示xt_hl.o没有make ...

  8. 老齐python-基础3(列表)

    1.定义一个列表 >>> a = [] #创建一个空列表 >>> type(a) #查看数据类型 <class 'list'> >>> ...

  9. GOF23设计模式之责任链模式(chain of responsibility)

    一.责任链模式概述 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求. 如果能则处理,否则传递给链上的下一个对象去处理. 定义责任链 (1)通过链表 ...

  10. 怎么使用ping命令进行连通性测试

    关于ping命令的作用: ping 命令有助于验证网络层的连通性!一般进行网络故障排除时,可以使用ping 命令向目标计算机或IP地址发送ICMP回显请求,目标计算机会返回回显应答,如果目标计算机不能 ...