一次只有一个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. Python 实现windows后台服务

    # -*- coding: utf-8 -*- import sys import win32api import win32con import win32event import win32ser ...

  2. 线性回归 Linear regression(1)线性回归的基本算法与求解

    本系列内容大部分来自Standford公开课machine learning中Andrew老师的讲解,附加自己的一些理解,编程实现和学习笔记. 第一章 Linear regression 1.线性回归 ...

  3. Servlet实现文件上传和下载

    对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具commo ...

  4. BZOJ1486 HNOI2009 最小圈 【01分数规划】

    BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...

  5. SpringBoot 项目修改html后不需要重新启动(热部署)

    基于IDEA配置: 一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  6. python string 之 format

    python 在 2.6之后支持了string的format功能, 很强大, 应该成为使用习惯. http://blog.csdn.net/handsomekang/article/details/9 ...

  7. phpstrom主题

    http://phpstorm-themes.com/ 安装方法 JAR文件 导航->file->Import Settings->然后选择你刚才下载的JAR文件->点击确认- ...

  8. centos安装 node.js

    curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash - yum clean all yum makeca ...

  9. hive加载json数据解决方案

    hive官方并不支持json格式的数据加载,默认支持csv格式文件加载,如何在不依赖外部jar包的情况下实现json数据格式解析,本编博客着重介绍此问题解决方案 首先创建元数据表: create EX ...

  10. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...