博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 编译着色器、创建顶点着色器、创建像素着色器
阅读量:4087 次
发布时间:2019-05-25

本文共 3688 字,大约阅读时间需要 12 分钟。

编译着色器、创建顶点着色器、创建像素着色器

1. 如何让GPU执行着色器代码?

你能够选择已经编译好的字节码,或者像我们直接由Direct3D来编译它,它可被本书后面的Demo所接受。编译一个着色器只需调用D3DX11CompileFormFile函数,该函数有很多个参数,我们一一细看:

第一个参数是HLSL着色器代码的载入和编译路径。
第二个参数是在着色器代码中的全局宏,该宏在HLSL 着色器中的工作方式与 C/C++中的宏一样。在应用程序内定义 HLSL 宏,使用类型D3D_SHADER_MACRO,一个例子如定义一个宏名“ AGE”,并且它代表 18,用法如下:

const D3D_SHADER_MACRO defineMacros[] ={"AGE", "18",};

第三个参数是一个可选参数,用于用于处理 HLSL 着色器文件中的#include 语句。这个接口的主要作用就是在包含它的着色器源代码中打开和关闭文件。

第四个参数是你所编译的着色器入口函数名。一个文件可以包含多个着色器类型(例如,顶点,像素,几何着色器等)和用于多种目的的多个函数。
第五个参数是具体的着色器模型,对于我们的目的可以使用 vs_4_0或者vs_5_0来代表使用着色器 4.0 或者 5.0。为了支持着色器模型 5.0,必须需要支持 DirectX 11 的图形硬件单元,这里使用着色器模型 4.0,只需要支持 DirectX 10 及以上的图形硬件。
第五个参数是具体的着色器模型,对于我们的目的可以使用 vs_4_0或者 vs_5_0 来代表使用着色器 4.0 或者 5.0。为了支持着色器模型 5.0,必须需要支持 DirectX 11 的图形硬件单元,这里使用着色器模型 4.0,只需要支持 DirectX 10 及以上的图形硬件。

D3D10_SHADER_AVOID_FLOW_CONTROL——任何时候都禁止流控制

D3D10_SHADER_DEBUG——编译着色器时插入调试信息
D3D10_SHADER_ENABLE_STRICTNESS——禁止过时的语法
D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY——在着色器 4.0 中允许过时的语法
D3D10_SHADER_FORCE_VS_SOFTWARE_NO_OPT——强制顶点着色器在下一个最高的支持版本上编译
D3D10_SHADER_FORCE_PS_SOFTWARE_NO_OPT——强制像素着色器在下一个最高的支持版本上编译
D3D10_SHADER_IEEE_STRICTNESS——在编译器中启用严格 IEEE 标准
D3D10_SHADER_NO_PRESHADER——禁止编译器从静态表达式中退出
D3D10_SHADER_OPTIMIZATION_LEVEL0 (0-3)——设置优化级别,第 0 级不优化,运行最慢,第 3 级完全优化
D3D10_SHADER_PACK_MATRIX_ROW_MAJOR——使用行主序布局的矩阵声明
D3D10_SHADER_PACK_MATRIX_COLUMN_MAJOR——使用列主序布局的矩阵声明
D3D10_SHADER_PARTIAL_PRECISION——强制使用局部精度计算,在某些硬件上会提升性能
D3D10_SHADER_PREFER_FLOW_CONTROL——告诉编译器在任何可能的时候尽量使用流控制
D3D10_SHADER_SKIP_OPTIMIZATION——编译着色器代码时,完全跳过优化阶段
D3D10_SHADER_WARNINGS_ARE_ERRORS——编译时将警告视为错误。

第七个参数是特效文件标识, 如果我们编译的着色器使用了特效文件就需要设置它,第七章有更多讨论。特效文件标识能够被设置为如下一个或多个标识:

D3D10_EFFECT_COMPILE_CHILD_EFFECT——允许编译子特效

D3D10_EFFECT_COMPILE_ALLOW_SLOW_OPS——禁止最佳性能模式
D3D10_EFFECT_SINGLE_THREADED——加载特效池(pool)时禁止与其它线程同步

第八个参数是指向一个线程 pump 的指针。若是设置为 NULL,则当编译完成时函数将返回。此参数处理多线程,在游戏开发中是一个很热门和高级的主题。使用线程允许我们异步加载着色器,调用此函数未返回时,可以继续后面的代码执行。

第九个参数是存放着色器编译完成后字节码的内存地址,它还包括所编译的着色器的任何调试和符号表信息。
第十个参数是存放编译过程中产生的错误和警告信息的内存地址。如果编译过程没有错误发生则该参数对象为 NULL,如果我们使用它来报告错误我们能够准备它。
第十一个参数是线程 pump 的返回值,如果线程 pump(第八个参数)不为 NULL,则该参数在异步执行完成前必须是一个有效地址。

2. 如何创建顶点着色器和像素着色器?

通过上面的方法编译好着色器字节码后,我们能够调用Direct3D 设备的CreateVertexShader 函数来创建顶点着色器,Direct3D 设备的 CreateVertexShader 函数来创建顶点着色器。该函数有四个参数:

第一个参数是编译好的字节码
第二个参数是字节码长度
第三个参数是链接类型的指针
第四个参数保存创建好的顶点着色器
像素着色器的参数类似于顶点着色器,这里就不多说了。

下面是创建顶点着色器示例代码:

ID3D11VertexShader* solidColorVS;ID3D11PixelShader* solidColorPS;ID3D11InputLayout* inputLayout;ID3DBlob* vsBuffer = 0;DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;#if defined( DEBUG ) || defined( _DEBUG )shaderFlags |= D3DCOMPILE_DEBUG;#endifID3DBlob* errorBuffer = 0;HRESULT result;result = D3DX11CompileFromFile( "sampleShader.fx", 0, 0, "VS_Main", "vs_4_0",    shaderFlags, 0, 0, &vsBuffer, &errorBuffer, 0 );if( FAILED( result ) ){    if( errorBuffer != 0 )    {        OutputDebugStringA( ( char* )errorBuffer->GetBufferPointer( ) );        errorBuffer->Release( );    }    return false;}if( errorBuffer != 0 )    errorBuffer->Release( );result = d3dDevice_->CreateVertexShader( vsBuffer->GetBufferPointer( ),    vsBuffer->GetBufferSize( ), 0, &solidColorVS );

下面是创建像素着色器示例代码:

ID3DBlob* psBuffer = 0;ID3DBlob* errorBuffer = 0;HRESULT result;result = D3DX11CompileFromFile( "sampleShader.fx", 0, 0, "PS_Main", "ps_4_0",    shaderFlags, 0, 0, &psBuffer, &errorBuffer, 0 );if( FAILED( result ) ){    if( errorBuffer != 0 )    {        OutputDebugStringA( ( char* )errorBuffer->GetBufferPointer( ) );        errorBuffer->Release( );    }    return false;}if( errorBuffer != 0 )    errorBuffer->Release( );result = d3dDevice_->CreatePixelShader( psBuffer->GetBufferPointer( ),    psBuffer->GetBufferSize( ), 0, &solidColorPS );psBuffer->Release( );if( FAILED( result ) ){    return false;}

转载地址:http://ujyii.baihongyu.com/

你可能感兴趣的文章
Nginx(2)---安装与启动
查看>>
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>
设计模式 依赖倒转原则 & 里氏代换原则
查看>>
DirectX11 光照
查看>>
图形学 图形渲染管线
查看>>
DirectX11 计时和动画
查看>>
DirectX11 光照与材质的相互作用
查看>>
DirectX11 法线向量
查看>>
DirectX11 兰伯特余弦定理(Lambert)
查看>>
DirectX11 漫反射光
查看>>
DirectX11 环境光
查看>>
DirectX11 镜面光
查看>>
DirectX11 三种光照组成对比
查看>>
DirectX11 指定材质
查看>>
DirectX11 平行光
查看>>
DirectX11 点光
查看>>
DirectX11 聚光灯
查看>>
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
查看>>