一次只有一个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. Java [Leetcode 387]First Unique Character in a String

    题目描述: Given a string, find the first non-repeating character in it and return it's index. If it does ...

  2. HDU3652 B-number 数位DP第二题

    A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- ...

  3. javascript中typeof用法

    JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof 可以用来检测给定变量的数据类型,可能的返回值: 1. 'undefined' --- 这个值未定义: 2. 'bool ...

  4. BZOJ3675 Apio2014 序列分割 【斜率优化】

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  5. 如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  6. direct2d封装

    图片项目

  7. 【DUBBO】Dubbo原理解析-服务引用

    服务引用是服务的消费方向注册中心订阅服务提供方提供的服务地址后向服务提供方引用服务的过程. 服务的应用方在spring的配置实例如下: <dubbo:referenceid="demo ...

  8. LG3835 【模板】可持久化平衡树

    题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名 ...

  9. Python——基础知识

    1. 运行Python文件 python(空格)文件路径  回车 2. 注释 (1)单行注释:# #注释内容 print('abc') #abc print("abc") #abc ...

  10. html基础1(环境准备、标签)

    学习目的 1,能改前端的模板 2,自己装修页面 3.前后端交互多个技术 4.能操作网页元素 5.能和前端开发人员沟通 开发工具: pycharm/webStorm EditPlus(适合初学) sub ...