(原)Unreal Shader模块(一): 着色创建
一、着色加载
这里说的Shader是编译后的文件或内存
源码说明
----------------------------------------------------------------------------------------------------------------------
|
D3D11Shaders.cpp |
RHI层级 |
封装DX,调用相关指令创建相关着色器,并且绑定布局(顶点布局) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下文均用DX说明
|
源码 |
:Engine\Source\Runtime\ShaderCore\ :Engine\Source\Runtime\Windows\ :Engine\Source\Runtime\Renderer\(只是上级) |
调用堆栈

这里比较重要的是:
RenderModule,,,
DeferredShadingSceneRender,,,
ShaderRources,,,
DrawingPolicy(此设计方法值得学习)
相关类图
1、基础


2、纹理
。。。。(待)
顶点着色器

娓娓道来:
大体上需要三个步骤
1、创建和初始化ShaderReader
2、创建个新的顶点着色,数据格式
3、shader数据选项赋予
ReadShaderOptionalData
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
DXAPI 回顾
----------------------------------------------------------------------------------------------------------------------
创建Shader
HRESULT ID3D11Device::CreateVertexShader
(
|
const void * |
pShaderBytecode, |
// [In]着色器字节码 |
|
SIZE_T |
BytecodeLength, |
// [In]字节码长度 |
|
ID3D11ClassLinkage * |
pClassLinkage, |
// [In_Opt]忽略 |
|
ID3D11VertexShader ** |
ppVertexShader |
// [Out]获取顶点着色器 |
);
类似的有
|
方法 |
着色器 |
类型描述 |
|
ID3D11Device::CreateVertexShader |
ID3D11VertexShader |
顶点着色器 |
|
ID3D11Device::CreateHullShader |
ID3D11HullShader |
外壳着色器 |
|
ID3D11Device::CreateDomainShader |
ID3D11DomainShader |
域着色器 |
|
ID3D11Device::CreateComputeShader |
ID3D11ComputeShader |
计算着色器 |
|
ID3D11Device::CreateGeometryShader |
ID3D11GeometryShader |
几何着色器 |
|
ID3D11Device::CreatePixelShader |
ID3D11PixelShader |
像素着色器 |
顶点输入布局:
HRESULT ID3D11Device::CreateInputLayout
(
|
const D3D11_INPUT_ELEMENT_DESC * |
pInputElementDescs |
// [In]输入布局描述 |
|
UINT |
NumElements |
// [In]上述数组元素个数 |
|
const void * |
pShaderBytecodeWithInputSignature |
// [In]顶点着色器字节码 |
|
SIZE_T |
BytecodeLength |
// [In]顶点着色器字节码长度 |
|
ID3D11InputLayout ** |
ppInputLayout); |
// [Out]获取的输入布局 |
);
typedef struct D3D11_INPUT_ELEMENT_DESC
{
|
LPCSTR |
SemanticName; |
// 语义名 |
|
UINT |
SemanticIndex; |
// 语义索引 |
|
DXGI_FORMAT |
Format; |
// 数据格式 |
|
UINT |
InputSlot; |
// 输入槽索引(0-15) |
|
UINT |
AlignedByteOffset; |
// 初始位置(字节偏移量) |
|
D3D11_INPUT_CLASSIFICATION |
InputSlotClass; |
// 输入类型 |
|
UINT |
InstanceDataStepRate; |
// 忽略 |
}
说明:
1、语义名要与HLSL结构体中的语义名相同,若有多个相同的语义名,则语义索引就是另外一种区分
2、DXGI_FORMAT在这里通常描述数据的存储方式、大小
3、初始位置则指的是该成员的位置与起始成员所在的字节偏移量
4、输入类型有两种:D3D11_INPUT_PER_VERTEX_DATA为按每个顶点数据输入,D3D11_INPUT_PER_INSTANCE_DATA则是按每个实例数据输入
HRESULT ID3D11Device::CreateInputLayout(
|
const D3D11_INPUT_ELEMENT_DESC * |
pInputElementDescs, |
// [In]输入布局描述 |
|
UINT |
NumElements, |
// [In]上述数组元素个数 |
|
const void * |
pShaderBytecodeWithInputSignature, |
// [In]顶点着色器字节码 |
|
SIZE_T |
BytecodeLength, |
// [In]顶点着色器字节码长度 |
|
ID3D11InputLayout ** |
ppInputLayout |
// [Out]获取的输入布局例如 |
);
一个例子
|
HLSL: struct VertexIn { float3 pos : POSITION; float4 color : COLOR; }; C++结构: struct VertexPosColor { DirectX::XMFLOAT3 pos; DirectX::XMFLOAT4 color; static const D3D11_INPUT_ELEMENT_DESC inputLayout[2]; // Static不占struct }; 布局: const D3D11_INPUT_ELEMENT_DESC VertexPosColor::inputLayout[2] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} }; |
-----------------------------------------------------------------------------------------------------------------------
(原)Unreal Shader模块(一): 着色创建的更多相关文章
- (转)Unreal Shader模块(四): 着色器编译
本文为(转):Unreal 调试着色器编译过程 调试着色器编译过程 Rolando Caloca 在 April 19, 2016 | 学习编程 Share on Facebook Shar ...
- (原)Unreal 渲染模块引言Temp
@author:白袍小道 引言 本文只在对Unreal渲染模块做一些详细的理解,务求能分析出个大概. 其中框架的思想和实现的过程,是非常值得学习和推敲一二的. 涉及资源系统,材 ...
- (原)Unreal渲染模块 管线 - 着色器(1)
@author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...
- (原)Unreal 渲染模块 渲染流程
@author:白袍小道 浏览分享随缘,评论不喷亦可. 扯淡部分: 在temp中,乱七八糟的说了下大致的UE过程.下面我们还是稍微别那么任性,一步步来吧. UE渲染模块牵扯到场景遍历. ...
- [译]Vulkan教程(13)图形管道基础之Shader模块
[译]Vulkan教程(13)图形管道基础之Shader模块 Shader modules Unlike earlier APIs, shader code in Vulkan has to be s ...
- [转载]Python模块学习 ---- subprocess 创建子进程
[转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...
- python模块介绍- xlwt 创建xls文件(excel)
python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...
- 学习《Oracle PL/SQL 实例讲解 原书第5版》----创建账户
通过readme.pdf创建student账户. 以下用sys账户登录时都是sysdba. 一.PL/SQL 登录oracle. SYS/123 AS SYSDBA 账户名:sys:密码:123:作 ...
- (原) Unreal创建自定义MeshCompoent
@author:白袍小道 随缘查看 前言: 绘制相关类 MeshCompoent 模型组件 FVertexBuffer 顶点缓冲区封装 FIndexBuffer 顶点索引缓冲区封装 FRHIResou ...
随机推荐
- 转:SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
转:https://www.cnblogs.com/zyw-205520/p/4771253.html 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年 ...
- ubuntu 报错E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unav E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process us
1.配置xshell,查看虚拟机中ubuntu中网络ip ifconfig 报错 Command 'ifconfig' not found, but can be installed with: su ...
- 散度(Divergence)和旋度(Curl)
原文链接 散度(Divergence) 散度的讨论应从向量和向量场说起.向量是数学中研究多维计算的基本概念.比如,速度可以分解为相互独立的分量,则速度就是一个多维的向量.假如空间中的每一个位置都有一个 ...
- Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合 ...
- C# is运算符
一.C# is运算符 is运算符用于检查对象是否与给定类型兼容(兼容表示对象是该类型,或者派生于该类型). is运算符用来检查对象(变量)是否属于某种数据类型,如int.string.bool.dou ...
- Git工作流指南:功能分支工作流(转)
一旦你玩转了集中式工作流,在开发过程中可以很简单地加上功能分支,用来鼓励开发者之间协作和简化交流. 功能分支工作流背后的核心思路是所有的功能开发应该在一个专门的分支,而不是在master分支上.这个隔 ...
- 给大家一个我的QQ群
很少关注博客了,提供一个QQ群讨论 我的一个QQ群:158351344
- iconv for linux(c)
// code_convert("gb2312","utf-8",inbuf,outbuf,outlen);static int code_convert(co ...
- 牛客小白月赛2 H 武 【Dijkstra】
链接:https://www.nowcoder.com/acm/contest/86/H来源:牛客网 题目描述 其次,Sεlιнα(Selina) 要进行体力比武竞赛. 在 Sεlιнα 所在的城市, ...
- Servlet学习笔记01——什么是servlet?
1.什么是Servlet? sun公司制订的一种用来扩展web服务器功能的组件规范. (1)扩展web服务器功能 早期的web服务器(apache web server,iis) 只能处理静态资源的请 ...