Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
GamebabyRockSun_QQ
GRSD3D12Sample
提交
81930397
G
GRSD3D12Sample
项目概览
GamebabyRockSun_QQ
/
GRSD3D12Sample
大约 1 年 前同步成功
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
1
Wiki
分析
仓库
DevOps
项目成员
Pages
G
GRSD3D12Sample
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
1
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
81930397
编写于
10月 26, 2019
作者:
GamebabyRockSun_QQ
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Pixel Shader 几个简单滤镜示例完成
上级
7e2e051d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
324 addition
and
28 deletion
+324
-28
10-PixelShaderTips/10-PixelShaderTips.cpp
10-PixelShaderTips/10-PixelShaderTips.cpp
+120
-23
10-PixelShaderTips/Shader/10-PixelShaderTips.hlsl
10-PixelShaderTips/Shader/10-PixelShaderTips.hlsl
+204
-5
Mesh/Earth_512.dds
Mesh/Earth_512.dds
+0
-0
Mesh/Noise.dds
Mesh/Noise.dds
+0
-0
Mesh/Noise1.dds
Mesh/Noise1.dds
+0
-0
未找到文件。
10-PixelShaderTips/10-PixelShaderTips.cpp
浏览文件 @
81930397
...
...
@@ -140,6 +140,8 @@ struct ST_GRS_PEROBJECT_CB
{
UINT
m_nFun
;
XMFLOAT2
m_v2TexSize
;
float
m_fQuatLevel
;
//量化bit数,取值2-6
float
m_fWaterPower
;
//表示水彩扩展力度,单位为像素
};
// 渲染子线程参数
...
...
@@ -159,11 +161,12 @@ struct ST_GRS_THREAD_PARAMS
XMFLOAT2
v2TexSize
;
TCHAR
pszDDSFile
[
MAX_PATH
];
CHAR
pszMeshFile
[
MAX_PATH
];
ID3D12Device4
*
pID3DDevice
;
ID3D12CommandAllocator
*
pICmdAlloc
;
ID3D12GraphicsCommandList
*
pICmdList
;
ID3D12RootSignature
*
pIRS
;
ID3D12PipelineState
*
pIPSO
;
ID3D12Device4
*
pID3DDevice
;
ID3D12CommandAllocator
*
pICmdAlloc
;
ID3D12GraphicsCommandList
*
pICmdList
;
ID3D12RootSignature
*
pIRS
;
ID3D12PipelineState
*
pIPSO
;
ID3D12Resource
*
pINoiseTexture
;
//噪声纹理
};
int
g_iWndWidth
=
1024
;
...
...
@@ -186,7 +189,7 @@ XMFLOAT3 g_f3HeapUp = XMFLOAT3(0.0f, 1.0f, 0.0f); //头
float
g_fYaw
=
0.0
f
;
// 绕正Z轴的旋转量.
float
g_fPitch
=
0.0
f
;
// 绕XZ平面的旋转量
double
g_fPalstance
=
10
.0
f
*
XM_PI
/
180.0
f
;
//物体旋转的角速度,单位:弧度/秒
double
g_fPalstance
=
5
.0
f
*
XM_PI
/
180.0
f
;
//物体旋转的角速度,单位:弧度/秒
XMFLOAT4X4
g_mxWorld
=
{};
//World Matrix
XMFLOAT4X4
g_mxVP
=
{};
//View Projection Matrix
...
...
@@ -209,8 +212,11 @@ ComPtr<ID3D12DescriptorHeap> g_pIDSVHeap; //
TCHAR
g_pszAppPath
[
MAX_PATH
]
=
{};
UINT
g_nFunNO
=
0
;
//当前使用效果函数的序号(按空格键循环切换)
UINT
g_nMaxFunNO
=
7
;
//总的效果函数个数
UINT
g_nFunNO
=
11
;
//当前使用效果函数的序号(按空格键循环切换)
UINT
g_nMaxFunNO
=
12
;
//总的效果函数个数
float
g_fQuatLevel
=
2.0
f
;
//量化bit数,取值2-6
float
g_fWaterPower
=
40.0
f
;
//表示水彩扩展力度,单位为像素
UINT
__stdcall
RenderThread
(
void
*
pParam
);
LRESULT
CALLBACK
WndProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
...
...
@@ -257,6 +263,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
ComPtr
<
ID3D12RootSignature
>
pIRootSignature
;
ComPtr
<
ID3D12PipelineState
>
pIPSOSphere
;
ComPtr
<
ID3D12Resource
>
pINoiseTexture
;
ComPtr
<
ID3D12Resource
>
pINoiseTextureUpload
;
try
{
// 得到当前的工作目录,方便我们使用相对路径来访问各种资源文件
...
...
@@ -522,7 +531,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
CD3DX12_DESCRIPTOR_RANGE1
stDSPRanges
[
3
];
stDSPRanges
[
0
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_CBV
,
2
,
0
);
//2 Const Buffer View
stDSPRanges
[
1
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_SRV
,
1
,
0
);
stDSPRanges
[
1
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_SRV
,
2
,
0
);
//2 Texture View 1 Texture + 1 Noise Texture
stDSPRanges
[
2
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER
,
1
,
0
);
CD3DX12_ROOT_PARAMETER1
stRootParameters
[
3
];
...
...
@@ -545,6 +554,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
ComPtr
<
ID3DBlob
>
pISignatureBlob
;
ComPtr
<
ID3DBlob
>
pIErrorBlob
;
GRS_THROW_IF_FAILED
(
D3DX12SerializeVersionedRootSignature
(
&
stRootSignatureDesc
,
stFeatureData
.
HighestVersion
,
&
pISignatureBlob
...
...
@@ -566,7 +576,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
#else
UINT
compileFlags
=
0
;
#endif
//编译为行矩阵形式
//编译为行矩阵形式
compileFlags
|=
D3DCOMPILE_PACK_MATRIX_ROW_MAJOR
;
TCHAR
pszShaderFileName
[
MAX_PATH
]
=
{};
...
...
@@ -638,11 +648,63 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pIPSOSphere
);
}
//11、准备参数并启动多个渲染线程
//11、加载DDS噪声纹理
{
TCHAR
pszNoiseTexture
[
MAX_PATH
]
=
{};
StringCchPrintf
(
pszNoiseTexture
,
MAX_PATH
,
_T
(
"%sMesh
\\
Noise1.dds"
),
g_pszAppPath
);
std
::
unique_ptr
<
uint8_t
[]
>
pbDDSData
;
std
::
vector
<
D3D12_SUBRESOURCE_DATA
>
stArSubResources
;
DDS_ALPHA_MODE
emAlphaMode
=
DDS_ALPHA_MODE_UNKNOWN
;
bool
bIsCube
=
false
;
GRS_THROW_IF_FAILED
(
LoadDDSTextureFromFile
(
pID3DDevice
.
Get
()
,
pszNoiseTexture
,
pINoiseTexture
.
GetAddressOf
()
,
pbDDSData
,
stArSubResources
,
SIZE_MAX
,
&
emAlphaMode
,
&
bIsCube
));
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pINoiseTexture
);
UINT64
n64szUpSphere
=
GetRequiredIntermediateSize
(
pINoiseTexture
.
Get
()
,
0
,
static_cast
<
UINT
>
(
stArSubResources
.
size
()));
D3D12_RESOURCE_DESC
stTXDesc
=
pINoiseTexture
->
GetDesc
();
GRS_THROW_IF_FAILED
(
pID3DDevice
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_UPLOAD
)
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Buffer
(
n64szUpSphere
)
,
D3D12_RESOURCE_STATE_GENERIC_READ
,
nullptr
,
IID_PPV_ARGS
(
&
pINoiseTextureUpload
)));
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pINoiseTextureUpload
);
//执行两个Copy动作将纹理上传到默认堆中
UpdateSubresources
(
pICmdListPre
.
Get
()
,
pINoiseTexture
.
Get
()
,
pINoiseTextureUpload
.
Get
()
,
0
,
0
,
static_cast
<
UINT
>
(
stArSubResources
.
size
())
,
stArSubResources
.
data
());
//同步
pICmdListPre
->
ResourceBarrier
(
1
,
&
CD3DX12_RESOURCE_BARRIER
::
Transition
(
pINoiseTexture
.
Get
()
,
D3D12_RESOURCE_STATE_COPY_DEST
,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
));
}
//12、准备参数并启动多个渲染线程
{
USES_CONVERSION
;
// 球体个性参数
StringCchPrintf
(
g_stThreadParams
[
g_nThdSphere
].
pszDDSFile
,
MAX_PATH
,
_T
(
"%s
\\
Mesh
\\
sphere
.dds"
),
g_pszAppPath
);
StringCchPrintf
(
g_stThreadParams
[
g_nThdSphere
].
pszDDSFile
,
MAX_PATH
,
_T
(
"%s
\\
Mesh
\\
7777
.dds"
),
g_pszAppPath
);
StringCchPrintfA
(
g_stThreadParams
[
g_nThdSphere
].
pszMeshFile
,
MAX_PATH
,
"%s
\\
Mesh
\\
sphere.txt"
,
T2A
(
g_pszAppPath
));
g_stThreadParams
[
g_nThdSphere
].
v4ModelPos
=
XMFLOAT4
(
2.0
f
,
2.0
f
,
0.0
f
,
1.0
f
);
...
...
@@ -678,6 +740,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
g_stThreadParams
[
i
].
pID3DDevice
=
pID3DDevice
.
Get
();
g_stThreadParams
[
i
].
pIRS
=
pIRootSignature
.
Get
();
g_stThreadParams
[
i
].
pIPSO
=
pIPSOSphere
.
Get
();
g_stThreadParams
[
i
].
pINoiseTexture
=
pINoiseTexture
.
Get
();
arHWaited
.
Add
(
g_stThreadParams
[
i
].
hEventRenderOver
);
//添加到被等待队列里
...
...
@@ -703,7 +766,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
}
}
//1
2
、创建围栏对象
//1
3
、创建围栏对象
{
GRS_THROW_IF_FAILED
(
pID3DDevice
->
CreateFence
(
0
,
D3D12_FENCE_FLAG_NONE
,
IID_PPV_ARGS
(
&
pIFence
)));
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pIFence
);
...
...
@@ -756,6 +819,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
arCmdList
.
RemoveAll
();
//执行命令列表
arCmdList
.
Add
(
pICmdListPre
.
Get
());
//主线程负责加载Noise纹理
arCmdList
.
Add
(
g_stThreadParams
[
g_nThdSphere
].
pICmdList
);
arCmdList
.
Add
(
g_stThreadParams
[
g_nThdCube
].
pICmdList
);
arCmdList
.
Add
(
g_stThreadParams
[
g_nThdPlane
].
pICmdList
);
...
...
@@ -808,6 +872,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
,
XMLoadFloat3
(
&
g_f3HeapUp
))
,
XMMatrixPerspectiveFovLH
(
XM_PIDIV4
,
(
FLOAT
)
g_iWndWidth
/
(
FLOAT
)
g_iWndHeight
,
0.1
f
,
1000.0
f
)));
}
//渲染前处理
...
...
@@ -823,6 +888,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
CD3DX12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
(
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
()
,
nCurrentFrameIndex
,
g_nRTVDescriptorSize
);
CD3DX12_CPU_DESCRIPTOR_HANDLE
dsvHandle
(
g_pIDSVHeap
->
GetCPUDescriptorHandleForHeapStart
());
//设置渲染目标
pICmdListPre
->
OMSetRenderTargets
(
1
,
&
stRTVHandle
,
FALSE
,
&
dsvHandle
);
...
...
@@ -928,13 +994,13 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
,
0
);
dwRet
-=
WAIT_OBJECT_0
;
if
(
dwRet
>=
0
&&
dwRet
<
g_nMaxThread
)
{
if
(
dwRet
>=
0
&&
dwRet
<
g_nMaxThread
)
{
//有线程的句柄已经成为有信号状态,即对应线程已经退出
bExit
=
TRUE
;
}
}
KillTimer
(
hWnd
,
WM_USER
+
100
);
::
KillTimer
(
hWnd
,
WM_USER
+
100
);
}
catch
(
CGRSCOMException
&
e
)
...
...
@@ -1068,7 +1134,7 @@ UINT __stdcall RenderThread(void* pParam)
//2、创建描述符堆
{
D3D12_DESCRIPTOR_HEAP_DESC
stSRVCBVHPDesc
=
{};
stSRVCBVHPDesc
.
NumDescriptors
=
3
;
// 2 CBV + 1
SRV
stSRVCBVHPDesc
.
NumDescriptors
=
4
;
// 2 CBV + 2
SRV
stSRVCBVHPDesc
.
Type
=
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
;
stSRVCBVHPDesc
.
Flags
=
D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE
;
...
...
@@ -1095,6 +1161,15 @@ UINT __stdcall RenderThread(void* pParam)
pITexture
.
Get
()
,
&
stSRVDesc
,
stCbvSrvHandle
);
//创建噪声纹理的描述符
stTXDesc
=
pThdPms
->
pINoiseTexture
->
GetDesc
();
stSRVDesc
.
Format
=
stTXDesc
.
Format
;
stCbvSrvHandle
.
Offset
(
1
,
g_nSRVDescriptorSize
);
pThdPms
->
pID3DDevice
->
CreateShaderResourceView
(
pThdPms
->
pINoiseTexture
,
&
stSRVDesc
,
stCbvSrvHandle
);
}
//3、创建常量缓冲
...
...
@@ -1225,8 +1300,6 @@ UINT __stdcall RenderThread(void* pParam)
::
HeapFree
(
::
GetProcessHeap
(),
0
,
pnIndices
);
}
//6、设置事件对象 通知并切回主线程 完成资源的第二个Copy命令
{
GRS_THROW_IF_FAILED
(
pThdPms
->
pICmdList
->
Close
());
...
...
@@ -1266,13 +1339,13 @@ UINT __stdcall RenderThread(void* pParam)
{
if
(
pThdPms
->
v4ModelPos
.
y
>=
2.0
f
*
fRawYPos
)
{
fUp
=
-
1.0
f
;
fUp
=
-
0.2
f
;
pThdPms
->
v4ModelPos
.
y
=
2.0
f
*
fRawYPos
;
}
if
(
pThdPms
->
v4ModelPos
.
y
<=
fRawYPos
)
{
fUp
=
1.0
f
;
fUp
=
0.2
f
;
pThdPms
->
v4ModelPos
.
y
=
fRawYPos
;
}
...
...
@@ -1292,6 +1365,8 @@ UINT __stdcall RenderThread(void* pParam)
CopyMemory
(
&
pPerObjBuf
->
m_v2TexSize
,
&
pThdPms
->
v2TexSize
,
sizeof
(
ST_GRS_PEROBJECT_CB
));
pPerObjBuf
->
m_nFun
=
g_nFunNO
;
pPerObjBuf
->
m_fQuatLevel
=
g_fQuatLevel
;
pPerObjBuf
->
m_fWaterPower
=
g_fWaterPower
;
}
//---------------------------------------------------------------------------------------------
...
...
@@ -1394,7 +1469,29 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
}
if
(
VK_ADD
==
n16KeyCode
||
VK_OEM_PLUS
==
n16KeyCode
)
if
(
11
==
g_nFunNO
)
{
//当进行水彩画效果渲染时控制生效
if
(
'Q'
==
n16KeyCode
||
'q'
==
n16KeyCode
)
{
//q 增加水彩取色半径
g_fWaterPower
+=
1.0
f
;
if
(
g_fWaterPower
>=
64.0
f
)
{
g_fWaterPower
=
8.0
f
;
}
}
if
(
'E'
==
n16KeyCode
||
'e'
==
n16KeyCode
)
{
//e 控制量化参数,范围 2 - 6
g_fQuatLevel
+=
1.0
f
;
if
(
g_fQuatLevel
>
6.0
f
)
{
g_fQuatLevel
=
2.0
f
;
}
}
}
if
(
VK_ADD
==
n16KeyCode
||
VK_OEM_PLUS
==
n16KeyCode
)
{
//double g_fPalstance = 10.0f * XM_PI / 180.0f; //物体旋转的角速度,单位:弧度/秒
g_fPalstance
+=
10
*
XM_PI
/
180.0
f
;
...
...
@@ -1487,7 +1584,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if
(
VK_TAB
==
n16KeyCode
)
{
//按Tab键还原摄像机位置
g_f3EyePos
=
XMFLOAT3
(
0.0
f
,
0
.0
f
,
-
10.0
f
);
//眼睛位置
g_f3EyePos
=
XMFLOAT3
(
0.0
f
,
5
.0
f
,
-
10.0
f
);
//眼睛位置
g_f3LockAt
=
XMFLOAT3
(
0.0
f
,
0.0
f
,
0.0
f
);
//眼睛所盯的位置
g_f3HeapUp
=
XMFLOAT3
(
0.0
f
,
1.0
f
,
0.0
f
);
//头部正上方位置
}
...
...
10-PixelShaderTips/Shader/10-PixelShaderTips.hlsl
浏览文件 @
81930397
...
...
@@ -14,9 +14,12 @@ cbuffer PerObjBuffer : register(b1)
{
uint
g_nFun
;
float2
g_v2TexSize
;
float
g_fQuatLevel
=
2
.
0
f
;
//量化bit数,取值2-6
float
g_fWaterPower
=
40
.
0
f
;
//表示水彩扩展力度,单位为像素
};
Texture2D
g_texture
:
register
(
t0
);
Texture2D
g_texNoise
:
register
(
t1
);
//噪声纹理
SamplerState
g_sampler
:
register
(
s0
);
PSInput
VSMain
(
float4
v4Pos
:
POSITION
,
float2
v2UV
:
TEXCOORD0
,
float3
v3Nor
:
NORMAL
)
...
...
@@ -97,31 +100,227 @@ float4 Mosaic2(PSInput input)
return
c4Color
;
}
float4
Do_Filter
(
float3x3
mxFilter
,
float2
v2UV
,
float2
v2TexSize
,
Texture2D
t2dTexture
)
{
float2
v2aUVDelta
[
3
][
3
]
=
{
{
float2
(
-
1
.
0
f
,
-
1
.
0
f
),
float2
(
0
.
0
f
,
-
1
.
0
f
),
float2
(
1
.
0
f
,
-
1
.
0
f
)
},
{
float2
(
0
.
0
f
,
-
1
.
0
f
),
float2
(
0
.
0
f
,
0
.
0
f
),
float2
(
1
.
0
f
,
0
.
0
f
)
},
{
float2
(
1
.
0
f
,
-
1
.
0
f
),
float2
(
0
.
0
f
,
1
.
0
f
),
float2
(
1
.
0
f
,
1
.
0
f
)
},
};
float4
c4Color
=
float4
(
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
);
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
for
(
int
j
=
0
;
j
<
3
;
j
++
)
{
//计算采样点,得到当前像素附件的像素点的坐标(上下左右,八方)
float2
v2NearbySite
=
float2
(
v2UV
.
x
+
v2aUVDelta
[
i
][
j
].
x
,
v2UV
.
y
+
v2aUVDelta
[
i
][
j
].
y
);
float2
v2NearbyUV
=
float2
(
v2NearbySite
.
x
/
v2TexSize
.
x
,
v2NearbySite
.
y
/
v2TexSize
.
y
);
c4Color
+=
(
t2dTexture
.
Sample
(
g_sampler
,
v2NearbyUV
)
*
mxFilter
[
i
][
j
]);
}
}
return
c4Color
;
}
float4
BoxFlur
(
float2
v2UV
,
float2
v2TexSize
)
{
//简单的9点Box模糊
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators
=
float3x3
(
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
,
1
.
0
f
/
9
.
0
f
);
return
Do_Filter
(
mxOperators
,
v2PixelSite
,
v2TexSize
,
g_texture
);
}
float4
GaussianFlur
(
float2
v2UV
,
float2
v2TexSize
)
{
//高斯模糊
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators
=
float3x3
(
1
.
0
f
/
16
.
0
f
,
2
.
0
f
/
16
.
0
f
,
1
.
0
f
/
16
.
0
f
,
2
.
0
f
/
16
.
0
f
,
4
.
0
f
/
16
.
0
f
,
2
.
0
f
/
16
.
0
f
,
1
.
0
f
/
16
.
0
f
,
2
.
0
f
/
16
.
0
f
,
1
.
0
f
/
16
.
0
f
);
return
Do_Filter
(
mxOperators
,
v2PixelSite
,
v2TexSize
,
g_texture
);
}
float4
LaplacianSharpen
(
float2
v2UV
,
float2
v2TexSize
)
{
//拉普拉斯锐化
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators
=
float3x3
(
-
1
.
0
f
,
-
1
.
0
f
,
-
1
.
0
f
,
-
1
.
0
f
,
9
.
0
f
,
-
1
.
0
f
,
-
1
.
0
f
,
-
1
.
0
f
,
-
1
.
0
f
);
return
Do_Filter
(
mxOperators
,
v2PixelSite
,
v2TexSize
,
g_texture
);
}
float4
Contour
(
float2
v2UV
,
float2
v2TexSize
)
{
//描边
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators
=
float3x3
(
-
0
.
5
f
,
-
1
.
0
f
,
0
.
0
f
,
-
1
.
0
f
,
0
.
0
f
,
1
.
0
f
,
-
0
.
0
f
,
1
.
0
f
,
0
.
5
f
);
float4
c4Color
=
Do_Filter
(
mxOperators
,
v2PixelSite
,
v2TexSize
,
g_texture
);
float
fDeltaGray
=
0
.
3
f
*
c4Color
.
x
+
0
.
59
*
c4Color
.
y
+
0
.
11
*
c4Color
.
z
;
if
(
fDeltaGray
<
0
.
0
f
)
{
fDeltaGray
=
-
1
.
0
f
*
fDeltaGray
;
}
fDeltaGray
=
1
.
0
f
-
fDeltaGray
;
return
float4
(
fDeltaGray
,
fDeltaGray
,
fDeltaGray
,
1
.
0
f
);
}
float4
SobelAnisotropyContour
(
float2
v2UV
,
float2
v2TexSize
)
{
//各向异性索博尔描边
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators1
=
float3x3
(
-
1
.
0
f
,
-
2
.
0
f
,
-
1
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
1
.
0
f
,
2
.
0
f
,
1
.
0
f
);
float3x3
mxOperators2
=
float3x3
(
-
1
.
0
f
,
0
.
0
f
,
1
.
0
f
,
-
2
.
0
f
,
0
.
0
f
,
2
.
0
f
,
-
1
.
0
f
,
0
.
0
f
,
1
.
0
f
);
float4
c4Color1
=
Do_Filter
(
mxOperators1
,
v2PixelSite
,
v2TexSize
,
g_texture
);
float4
c4Color2
=
Do_Filter
(
mxOperators2
,
v2PixelSite
,
v2TexSize
,
g_texture
);
c4Color1
+=
c4Color2
;
float
fDeltaGray
=
0
.
3
f
*
c4Color1
.
x
+
0
.
59
*
c4Color1
.
y
+
0
.
11
*
c4Color1
.
z
;
if
(
fDeltaGray
<
0
.
0
f
)
{
fDeltaGray
=
-
1
.
0
f
*
fDeltaGray
;
}
fDeltaGray
=
1
.
0
f
-
fDeltaGray
;
return
float4
(
fDeltaGray
,
fDeltaGray
,
fDeltaGray
,
1
.
0
f
);
}
float4
SobelIsotropyContour
(
float2
v2UV
,
float2
v2TexSize
)
{
//各向同性索博尔描边
float2
v2PixelSite
=
float2
(
v2UV
.
x
*
v2TexSize
.
x
,
v2UV
.
y
*
v2TexSize
.
y
);
float3x3
mxOperators1
=
float3x3
(
-
1
.
0
f
,
-
1
.
414214
f
,
-
1
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
1
.
0
f
,
1
.
414214
f
,
1
.
0
f
);
float3x3
mxOperators2
=
float3x3
(
-
1
.
0
f
,
0
.
0
f
,
1
.
0
f
,
-
1
.
414214
f
,
0
.
0
f
,
1
.
414214
f
,
-
1
.
0
f
,
0
.
0
f
,
1
.
0
f
);
float4
c4Color1
=
Do_Filter
(
mxOperators1
,
v2PixelSite
,
v2TexSize
,
g_texture
);
float4
c4Color2
=
Do_Filter
(
mxOperators2
,
v2PixelSite
,
v2TexSize
,
g_texture
);
c4Color1
+=
c4Color2
;
float
fDeltaGray
=
0
.
3
f
*
c4Color1
.
x
+
0
.
59
*
c4Color1
.
y
+
0
.
11
*
c4Color1
.
z
;
if
(
fDeltaGray
<
0
.
0
f
)
{
fDeltaGray
=
-
1
.
0
f
*
fDeltaGray
;
}
fDeltaGray
=
1
.
0
f
-
fDeltaGray
;
return
float4
(
fDeltaGray
,
fDeltaGray
,
fDeltaGray
,
1
.
0
f
);
}
//float g_fQuatLevel = 2; //量化bit数,取值2-6
//float g_fWaterPower = 40; //表示水彩扩展力度,单位为像素
//Texture2D g_texture : register(t0);
//Texture2D g_texNoise: register(t1); //噪声纹理
float4
Quant
(
float4
c4Color
,
float
n
)
{
c4Color
.
x
=
int
(
c4Color
.
x
*
255
/
n
)
*
n
/
255
;
c4Color
.
y
=
int
(
c4Color
.
y
*
255
/
n
)
*
n
/
255
;
c4Color
.
z
=
int
(
c4Color
.
z
*
255
/
n
)
*
n
/
255
;
return
c4Color
;
}
float4
Watercolour
(
float2
v2UV
,
float2
v2TexSize
)
{
float4
c4NoiseColor
=
g_fWaterPower
*
g_texNoise
.
Sample
(
g_sampler
,
v2UV
);
float2
v2NewUV
=
float2
(
v2UV
.
x
+
c4NoiseColor
.
x
/
v2TexSize
.
x
,
v2UV
.
y
+
c4NoiseColor
.
y
/
v2TexSize
.
y
);
float4
c4Color
=
g_texture
.
Sample
(
g_sampler
,
v2UV
);
return
Quant
(
c4Color
,
255
/
pow
(
2
,
g_fQuatLevel
));
}
float4
PSMain
(
PSInput
input
)
:
SV_TARGET
{
float4
c4PixelColor
;
if
(
0
==
g_nFun
)
{
//原图
c4PixelColor
=
g_texture
.
Sample
(
g_sampler
,
input
.
m_v2UV
);
}
else
if
(
1
==
g_nFun
)
{
//黑白效果
c4PixelColor
=
g_texture
.
Sample
(
g_sampler
,
input
.
m_v2UV
);
c4PixelColor
=
BlackAndWhitePhoto
(
c4PixelColor
);
}
else
if
(
1
==
g_nFun
)
else
if
(
2
==
g_nFun
)
{
//浮雕效果
c4PixelColor
=
Anaglyph
(
input
);
}
else
if
(
2
==
g_nFun
)
else
if
(
3
==
g_nFun
)
{
//方块马赛克
c4PixelColor
=
Mosaic1
(
input
);
}
else
if
(
3
==
g_nFun
)
else
if
(
4
==
g_nFun
)
{
//圆片马赛克
c4PixelColor
=
Mosaic2
(
input
);
}
else
if
(
5
==
g_nFun
)
{
//Box模糊,9点颜色平均值
c4PixelColor
=
BoxFlur
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
6
==
g_nFun
)
{
//高斯模糊
c4PixelColor
=
GaussianFlur
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
7
==
g_nFun
)
{
//拉普拉斯锐化
c4PixelColor
=
LaplacianSharpen
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
8
==
g_nFun
)
{
//描边
c4PixelColor
=
Contour
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
9
==
g_nFun
)
{
//索博尔各向异性描边
c4PixelColor
=
SobelAnisotropyContour
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
10
==
g_nFun
)
{
//索博尔各向同性描边
c4PixelColor
=
SobelIsotropyContour
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
if
(
11
==
g_nFun
)
{
//水彩画效果
c4PixelColor
=
Watercolour
(
input
.
m_v2UV
,
g_v2TexSize
);
}
else
{
//原图
{
//
默认
原图
c4PixelColor
=
g_texture
.
Sample
(
g_sampler
,
input
.
m_v2UV
);
}
return
c4PixelColor
;
}
Mesh/Earth_512.dds
0 → 100644
浏览文件 @
81930397
文件已添加
Mesh/Noise.dds
0 → 100644
浏览文件 @
81930397
文件已添加
Mesh/Noise1.dds
0 → 100644
浏览文件 @
81930397
文件已添加
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录