提交 81930397 编写于 作者: GamebabyRockSun_QQ's avatar GamebabyRockSun_QQ

Pixel Shader 几个简单滤镜示例完成

上级 7e2e051d
......@@ -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.0f; // 绕正Z轴的旋转量.
float g_fPitch = 0.0f; // 绕XZ平面的旋转量
double g_fPalstance = 10.0f * XM_PI / 180.0f; //物体旋转的角速度,单位:弧度/秒
double g_fPalstance = 5.0f * XM_PI / 180.0f; //物体旋转的角速度,单位:弧度/秒
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.0f; //量化bit数,取值2-6
float g_fWaterPower = 40.0f; //表示水彩扩展力度,单位为像素
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.0f, 2.0f, 0.0f, 1.0f);
......@@ -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
}
}
//12、创建围栏对象
//13、创建围栏对象
{
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.1f, 1000.0f)));
}
//渲染前处理
......@@ -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.0f * fRawYPos)
{
fUp = -1.0f;
fUp = -0.2f;
pThdPms->v4ModelPos.y = 2.0f * fRawYPos;
}
if (pThdPms->v4ModelPos.y <= fRawYPos)
{
fUp = 1.0f;
fUp = 0.2f;
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.0f;
if (g_fWaterPower >= 64.0f)
{
g_fWaterPower = 8.0f;
}
}
if ( 'E' == n16KeyCode || 'e' == n16KeyCode )
{//e 控制量化参数,范围 2 - 6
g_fQuatLevel += 1.0f;
if (g_fQuatLevel > 6.0f)
{
g_fQuatLevel = 2.0f;
}
}
}
if ( VK_ADD == n16KeyCode || VK_OEM_PLUS == n16KeyCode )
{
//double g_fPalstance = 10.0f * XM_PI / 180.0f; //物体旋转的角速度,单位:弧度/秒
g_fPalstance += 10 * XM_PI / 180.0f;
......@@ -1487,7 +1584,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (VK_TAB == n16KeyCode)
{//按Tab键还原摄像机位置
g_f3EyePos = XMFLOAT3(0.0f, 0.0f, -10.0f); //眼睛位置
g_f3EyePos = XMFLOAT3(0.0f, 5.0f, -10.0f); //眼睛位置
g_f3LockAt = XMFLOAT3(0.0f, 0.0f, 0.0f); //眼睛所盯的位置
g_f3HeapUp = XMFLOAT3(0.0f, 1.0f, 0.0f); //头部正上方位置
}
......
......@@ -14,9 +14,12 @@ cbuffer PerObjBuffer : register(b1)
{
uint g_nFun;
float2 g_v2TexSize;
float g_fQuatLevel = 2.0f; //量化bit数,取值2-6
float g_fWaterPower = 40.0f; //表示水彩扩展力度,单位为像素
};
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.0f,-1.0f), float2(0.0f,-1.0f),float2(1.0f,-1.0f) },
{ float2(0.0f,-1.0f), float2(0.0f,0.0f), float2(1.0f,0.0f) },
{ float2(1.0f,-1.0f), float2(0.0f,1.0f), float2(1.0f,1.0f) },
};
float4 c4Color = float4(0.0f, 0.0f, 0.0f, 0.0f);
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.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f
, 1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f
, 1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f);
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.0f / 16.0f, 2.0f / 16.0f, 1.0f / 16.0f
, 2.0f / 16.0f, 4.0f / 16.0f, 2.0f / 16.0f
, 1.0f / 16.0f, 2.0f / 16.0f, 1.0f / 16.0f);
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.0f, -1.0f, -1.0f
, -1.0f, 9.0f, -1.0f
, -1.0f, -1.0f, -1.0f);
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.5f, -1.0f, 0.0f
, -1.0f, 0.0f, 1.0f
, -0.0f, 1.0f, 0.5f);
float4 c4Color = Do_Filter(mxOperators, v2PixelSite, v2TexSize, g_texture);
float fDeltaGray = 0.3f * c4Color.x + 0.59 * c4Color.y + 0.11 * c4Color.z;
if (fDeltaGray < 0.0f)
{
fDeltaGray = -1.0f * fDeltaGray;
}
fDeltaGray = 1.0f - fDeltaGray;
return float4(fDeltaGray, fDeltaGray, fDeltaGray, 1.0f);
}
float4 SobelAnisotropyContour(float2 v2UV, float2 v2TexSize)
{//各向异性索博尔描边
float2 v2PixelSite
= float2(v2UV.x * v2TexSize.x, v2UV.y * v2TexSize.y);
float3x3 mxOperators1
= float3x3( -1.0f, -2.0f, -1.0f
, 0.0f, 0.0f, 0.0f
, 1.0f, 2.0f, 1.0f
);
float3x3 mxOperators2
= float3x3( -1.0f, 0.0f, 1.0f
,-2.0f, 0.0f, 2.0f
,-1.0f, 0.0f, 1.0f
);
float4 c4Color1 = Do_Filter(mxOperators1, v2PixelSite, v2TexSize, g_texture);
float4 c4Color2 = Do_Filter(mxOperators2, v2PixelSite, v2TexSize, g_texture);
c4Color1 += c4Color2;
float fDeltaGray = 0.3f * c4Color1.x + 0.59 * c4Color1.y + 0.11 * c4Color1.z;
if (fDeltaGray < 0.0f)
{
fDeltaGray = -1.0f * fDeltaGray;
}
fDeltaGray = 1.0f - fDeltaGray;
return float4(fDeltaGray, fDeltaGray, fDeltaGray, 1.0f);
}
float4 SobelIsotropyContour(float2 v2UV, float2 v2TexSize)
{//各向同性索博尔描边
float2 v2PixelSite
= float2(v2UV.x * v2TexSize.x, v2UV.y * v2TexSize.y);
float3x3 mxOperators1
= float3x3( -1.0f, -1.414214f, -1.0f
, 0.0f, 0.0f, 0.0f
, 1.0f, 1.414214f, 1.0f
);
float3x3 mxOperators2
= float3x3( -1.0f, 0.0f, 1.0f
, -1.414214f, 0.0f, 1.414214f
, -1.0f, 0.0f, 1.0f
);
float4 c4Color1 = Do_Filter(mxOperators1, v2PixelSite, v2TexSize, g_texture);
float4 c4Color2 = Do_Filter(mxOperators2, v2PixelSite, v2TexSize, g_texture);
c4Color1 += c4Color2;
float fDeltaGray = 0.3f * c4Color1.x + 0.59 * c4Color1.y + 0.11 * c4Color1.z;
if (fDeltaGray < 0.0f)
{
fDeltaGray = -1.0f * fDeltaGray;
}
fDeltaGray = 1.0f - fDeltaGray;
return float4(fDeltaGray, fDeltaGray, fDeltaGray, 1.0f);
}
//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;
}
文件已添加
文件已添加
文件已添加
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册