一、着色加载

这里说的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模块(一): 着色创建的更多相关文章

  1. (转)Unreal Shader模块(四): 着色器编译

    本文为(转):Unreal 调试着色器编译过程     调试着色器编译过程 Rolando Caloca 在 April 19, 2016 | 学习编程 Share on Facebook  Shar ...

  2. (原)Unreal 渲染模块引言Temp

            @author:白袍小道     引言 本文只在对Unreal渲染模块做一些详细的理解,务求能分析出个大概. 其中框架的思想和实现的过程,是非常值得学习和推敲一二的. 涉及资源系统,材 ...

  3. (原)Unreal渲染模块 管线 - 着色器(1)

    @author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...

  4. (原)Unreal 渲染模块 渲染流程

    @author:白袍小道 浏览分享随缘,评论不喷亦可.     扯淡部分: 在temp中,乱七八糟的说了下大致的UE过程.下面我们还是稍微别那么任性,一步步来吧.     UE渲染模块牵扯到场景遍历. ...

  5. [译]Vulkan教程(13)图形管道基础之Shader模块

    [译]Vulkan教程(13)图形管道基础之Shader模块 Shader modules Unlike earlier APIs, shader code in Vulkan has to be s ...

  6. [转载]Python模块学习 ---- subprocess 创建子进程

    [转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...

  7. python模块介绍- xlwt 创建xls文件(excel)

    python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...

  8. 学习《Oracle PL/SQL 实例讲解 原书第5版》----创建账户

    通过readme.pdf创建student账户. 以下用sys账户登录时都是sysdba. 一.PL/SQL 登录oracle. SYS/123  AS SYSDBA 账户名:sys:密码:123:作 ...

  9. (原) Unreal创建自定义MeshCompoent

    @author:白袍小道 随缘查看 前言: 绘制相关类 MeshCompoent 模型组件 FVertexBuffer 顶点缓冲区封装 FIndexBuffer 顶点索引缓冲区封装 FRHIResou ...

随机推荐

  1. 【BZOJ5212】[ZJOI2018] 历史(LCT大黑题)

    点此看题面 大致题意: 给定一棵树每个节点\(Access\)的次数,求最大虚实链切换次数,带修改. 什么是\(Access\)? 推荐你先去学一学\(LCT\)吧. 初始化(不带修改的做法) 首先考 ...

  2. Centos6.4环境下DNS服务器的搭建

    DNS服务器搭建很繁琐吗?给你个简单的招吧! 配置域主服务器 阶段: 1.在bind的主配置文件中添加该域 2.在/var/named中创建该域的zone文件 3.编辑zone文件,添加需要的信息 4 ...

  3. Linux(二) - Unix&Linux 基本概念

    主机 = 内核 + 实用工具 内核(kernel) 当计算机启动时,计算机要经历一系列动作,这些动作构成了引导过程.引导过程的最后一个动作是启动一个非常复杂的程序,该程序就被称为内核(Kernel) ...

  4. miller——rabin

    突然发现自己在线性筛素数中有这个,忘了好久: #include<iostream> #include<cstdio> using namespace std; long lon ...

  5. NodeJS中常见异步接口定义(get、post、jsonp)

    越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp).再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式, ...

  6. Ext4.2 select 和 query 区别与联系

    Ext.query和Ext.select的作用是一致的,同是根据CSS选择符查找出一个或多个元素.区别在于返回类型上.分别是:query方法返回的是JavaScript标准的数组类型:select方法 ...

  7. 理解 JavaScript 作用域(转)

    简介 JavaScript 有个特性称为作用域.尽管对于很多开发新手来说,作用域的概念不容易理解,我会尽可能地从最简单的角度向你解释它们.理解作用域能让你编写更优雅.错误更少的代码,并能帮助你实现强大 ...

  8. Vue项目架构设计与工程化实践

    摘自Berwin<Vue项目架构设计与工程化实践>github.com/berwin/Blog/issues/14 1.Vue依赖套件 vuex:项目复杂后,用vuex来管理状态 elem ...

  9. 爬虫学习(十九)——Scrapy的学习及其使用

    Scrapy框架的介绍 Scrapy,非常的强悍,通过python语言编写的,非常知名的爬虫框架 框架工作流程 框架流程图 基本工作流程; 1.引擎向spiders要url 2.引擎将要爬取的url给 ...

  10. spring-传统AOP

    Spring传统AOP AOP的增强类型 AOP联盟定义了Advice(org.aopalliance.aop.Interface.Advice) 五类(目标类方法的连接点): 1.  前置通知(or ...