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

没有大的变动,只是将一些shader中的注释删除了,并替换了几个天空盒资源测试了一下

上级 927650e5
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
//这个Shader改编自微软官方D3D12示例,删除了不必要的VS函数,以及啰嗦的为测试性能而编造的假循环
struct PSInput
......@@ -60,56 +49,3 @@ float4 PSSimpleBlurU(PSInput input) : SV_TARGET
}
return float4(textureColor, 1.0);
}
/////-----------------------------------------------------------------------------------
//void main()
//{
// vec4 textureColor;
// vec4 outColor;
// vec4 U;
// vec4 V;
//
// if (PixFormat == 1000.0f)
// {
// //RGB32
// textureColor = vec4(texture2D(textureUniformRGBA, textureCoordinate));
// textureColor.a = textureColor.a * RGB_Alpha;
// }
// else
// {
// //YUV420 TO RGB32
// textureColor = vec4((texture2D(textureUniformY, textureCoordinate).r - 16. / 255.) * 1.164);
// U = vec4(texture2D(textureUniformU, textureCoordinate).r - 128. / 255.);
// V = vec4(texture2D(textureUniformV, textureCoordinate).r - 128. / 255.);
// textureColor += V * vec4(1.596, -0.813, 0, 0);
// textureColor += U * vec4(0, -0.392, 2.017, 0);
// textureColor.a = RGB_Alpha;
// }
// if (1 == dark)
// {
// float brightness = 0.45f;
// //模糊
// vec2 firstOffset = vec2(1.3846153846 * texelWidthOffset, 1.3846153846 * texelHeightOffset) * blurSize;
// vec2 secondOffset = vec2(3.2307692308 * texelWidthOffset, 3.2307692308 * texelHeightOffset) * blurSize;
//
// centerTextureCoordinate = textureCoordinate;
// oneStepLeftTextureCoordinate = textureCoordinate - firstOffset;
// twoStepsLeftTextureCoordinate = textureCoordinate - secondOffset;
// oneStepRightTextureCoordinate = textureCoordinate + firstOffset;
// twoStepsRightTextureCoordinate = textureCoordinate + secondOffset;
//
// vec4 fragmentColor = texture2D(textureUniformRGBA, centerTextureCoordinate) * 0.2270270270;
// fragmentColor += texture2D(textureUniformRGBA, oneStepLeftTextureCoordinate) * 0.3162162162;
// fragmentColor += texture2D(textureUniformRGBA, oneStepRightTextureCoordinate) * 0.3162162162;
// fragmentColor += texture2D(textureUniformRGBA, twoStepsLeftTextureCoordinate) * 0.0702702703; /
// fragmentColor += texture2D(textureUniformRGBA, twoStepsRightTextureCoordinate) * 0.0702702703;
//
// //加暗
// textureColor = vec4((fragmentColor.rgb * vec3(brightness)), fragmentColor.a);
// //最后画面
// gl_FragColor = textureColor;
//
// }
//}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
......@@ -2070,7 +2070,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if ( WAIT_OBJECT_0 == dwRet )
{
SetEvent(g_hEventFence);
}
}
}
}
......
......@@ -1138,7 +1138,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
for (int i = 0; i < GRS_NUM_LIGHTS; i++)
{
g_pstLights->m_stLights[i].m_v4Position = { 0.0f, 10.0f, -15.0f, 1.0f };
g_pstLights->m_stLights[i].m_v4Direction = { 0.0, 0.0f, 1.0f, 0.0f };
g_pstLights->m_stLights[i].m_v4Direction = { 0.0, -1.0f, 1.0f, 0.0f };
g_pstLights->m_stLights[i].m_v4Falloff = { 80.0f, 1.0f, 0.0f, 1.0f };
g_pstLights->m_stLights[i].m_v4Color = { 0.9f, 0.9f, 0.9f, 1.0f };
......@@ -1321,6 +1321,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
//XMStoreFloat4x4(&g_mxWorld, XMMatrixRotationY(static_cast<float>(dModelRotationYAngle)));
XMStoreFloat4x4(&g_mxWorld, XMMatrixIdentity());
// 变换光源
for (int i = 0; i < GRS_NUM_LIGHTS; i++)
{
......@@ -1399,7 +1400,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
{
// OnUpdate() 恢复View Projection 矩阵到摄像机空间
{
//计算 World 矩阵 这里是个旋转矩阵
//XMStoreFloat4x4(&g_mxWorld, XMMatrixRotationY(static_cast<float>(dModelRotationYAngle)));
//计算 摄像机空间视矩阵 view
XMStoreFloat4x4(&g_mxView
, XMMatrixLookAtLH(
......@@ -1873,6 +1876,9 @@ UINT __stdcall RenderThread(void* pParam)
float fUp = 1.0f;
float fRawYPos = pThdPms->m_v4ModelPos.y;
//计算旋转角度需要的变量
double dModelRotationYAngle = 0.0f;
DWORD dwRet = 0;
BOOL bQuit = FALSE;
MSG msg = {};
......@@ -1894,12 +1900,14 @@ UINT __stdcall RenderThread(void* pParam)
//注意只更新一次场景,后面两遍渲染都用相同的常量缓冲了
// OnUpdate()
{
// 计算平移矩阵(物体相对于世界空间的位置)
mxPosModule = XMMatrixTranslationFromVector(XMLoadFloat4(&pThdPms->m_v4ModelPos));
//==============================================================================
//使用主线程更新的统一帧时间更新下物体的物理状态等,这里仅演示球体上下跳动的样子
//启发式的向大家说明利用多线程渲染时,物理变换可以在不同的线程中,并且在不同的CPU上并行的执行
if (g_nThdSphere == pThdPms->m_nThreadIndex)
{
{// 球体多一个弹跳
if (pThdPms->m_v4ModelPos.y >= 2.0f * fRawYPos)
{
fUp = -1.0f;
......@@ -1917,14 +1925,24 @@ UINT __stdcall RenderThread(void* pParam)
mxPosModule = XMMatrixTranslationFromVector(XMLoadFloat4(&pThdPms->m_v4ModelPos));
}
//==============================================================================
//计算旋转角度
dModelRotationYAngle += ((pThdPms->m_nCurrentTime - pThdPms->m_nStartTime) / 1000.0f) * g_fPalstance;
// Module * World
XMMATRIX xmMW = XMMatrixMultiply(mxPosModule, XMLoadFloat4x4(&g_mxWorld));
//旋转角度是2PI周期的倍数,去掉周期数,只留下相对0弧度开始的小于2PI的弧度即可
if (dModelRotationYAngle > XM_2PI)
{
dModelRotationYAngle = fmod(dModelRotationYAngle, XM_2PI);
}
// 计算相对于世界矩阵Y轴的旋转矩阵
XMMATRIX xmRot = XMMatrixRotationY(static_cast<float>(dModelRotationYAngle));
// (Module * World) * View * Projection
// xmMW = XMMatrixMultiply(xmMW, XMLoadFloat4x4(&g_mxWorld));
// 平移->旋转
mxPosModule = XMMatrixMultiply(mxPosModule, xmRot);
// Module * World
mxPosModule = XMMatrixMultiply(mxPosModule, XMLoadFloat4x4(&g_mxWorld));
XMStoreFloat4x4(&pMVPBufModule->g_mxModel, xmMW);
XMStoreFloat4x4(&pMVPBufModule->g_mxModel, mxPosModule);
pMVPBufModule->g_mxView = g_mxView;
pMVPBufModule->g_mxProjection = g_mxProjection;
......
......@@ -43,11 +43,11 @@ float3 CalcPerPixelNormal(float2 vTexcoord, float3 vVertNormal, float3 vVertTang
vVertNormal = normalize(vVertNormal);
vVertTangent = normalize(vVertTangent);
float3 vVertBinormal = normalize(cross(vVertTangent, vVertNormal));
float3 vVertBinormal = normalize(cross(vVertNormal,vVertTangent));
// 生成切空间变换矩阵(逆矩阵就是从世界空间变换到切线空间)
float3x3 mTangentSpaceToWorldSpace = float3x3(vVertTangent, vVertBinormal, vVertNormal);
float3x3 mTangentSpaceToWorldSpace = float3x3(vVertTangent, vVertNormal, vVertBinormal);
//mTangentSpaceToWorldSpace = transpose(mTangentSpaceToWorldSpace);
mTangentSpaceToWorldSpace = transpose(mTangentSpaceToWorldSpace);
// 采样逐像素法线
float3 vBumpNormal = (float3)g_t2dNormalMap.Sample(g_SampleWrap, vTexcoord);
......@@ -145,10 +145,33 @@ float4 PSMain(PSInput input) : SV_TARGET
totalLight += lightPass;
}
//float4 vLightSpacePos = input.v4WorldPosition;
//vLightSpacePos = mul(vLightSpacePos, stLights[0].mxView);
//vLightSpacePos = mul(vLightSpacePos, stLights[0].mxProjection);
//vLightSpacePos.xyz /= vLightSpacePos.w;
//return float4(pixelNormal, 1.0f);
float4 vLightSpacePos = input.v4WorldPosition;
vLightSpacePos = mul(vLightSpacePos, stLights[0].mxView);
vLightSpacePos = mul(vLightSpacePos, stLights[0].mxProjection);
vLightSpacePos.xyz /= vLightSpacePos.w;
float2 v2LightCoord = 0.5f * vLightSpacePos.xy + 0.5f;
v2LightCoord.y = 1.0f - v2LightCoord.y;
float4 fPixelColor = diffuseColor;
float fDepthValue = g_t2dShadowMap.Sample(g_SampleClamp, v2LightCoord);
vLightSpacePos.z -= 0.05f;
if ( vLightSpacePos.z < fDepthValue )
{
fPixelColor += v4AmbientColor;
//float lightIntensity = saturate(-dot(pixelNormal.xyz, stLights[0].v4Direction.xyz));
//if ( lightIntensity > 0.0f )
//{
// fPixelColor += (diffuseColor * lightIntensity);
//}
}
else
{
fPixelColor -= v4AmbientColor;
}
return fPixelColor;
//return float4(vLightSpacePos.z, vLightSpacePos.z, vLightSpacePos.z, 1.0f);
//return vLightSpacePos;
......
......@@ -52,7 +52,7 @@ struct ST_GRS_THREAD_PARAMS
};
// 假设我们需要g_nMaxThread个渲染子线程,若需要动态调整就需要将渲染子线程参数用动态数组包装,如:CAtlArray、stl::vector等
const UINT g_nMaxThread = 4;
const UINT g_nMaxThread = 64;
ST_GRS_THREAD_PARAMS g_stThreadParams[g_nMaxThread] = {};
// 线程池管理内核同步对象
......@@ -170,7 +170,6 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
}
}
DWORD dwRet = 0;
BOOL bExit = FALSE;
......
......@@ -214,7 +214,7 @@ XMFLOAT3 g_f3EyePos = XMFLOAT3(0.0f, 2.0f, -10.0f); //
XMFLOAT3 g_f3LockAt = XMFLOAT3(0.0f, 0.0f, 0.0f); //眼睛所盯的位置
XMFLOAT3 g_f3HeapUp = XMFLOAT3(0.0f, 1.0f, 0.0f); //头部正上方位置
float g_fYaw = 0.0f; // 绕正Z轴的旋转量.
float g_fYaw = 0.0f; // 绕正Z轴的旋转量.
float g_fPitch = 0.0f; // 绕XZ平面的旋转量
double g_fPalstance = 10.0f * XM_PI / 180.0f; //物体旋转的角速度,单位:弧度/秒
......@@ -236,8 +236,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
MSG msg = {};
TCHAR pszAppPath[MAX_PATH] = {};
ST_GRS_FRAME_MVP_BUFFER* pMVPBufEarth = nullptr;
ST_GRS_FRAME_MVP_BUFFER* pMVPBufSkybox = nullptr;
ST_GRS_FRAME_MVP_BUFFER* pMVPBufEarth = nullptr;
ST_GRS_FRAME_MVP_BUFFER* pMVPBufSkybox = nullptr;
//常量缓冲区大小上对齐到256Bytes边界
SIZE_T szMVPBuf = GRS_UPPER(sizeof(ST_GRS_FRAME_MVP_BUFFER), 256);
......@@ -983,7 +984,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
// 使用DDSLoader辅助函数加载Skybox的纹理
{
TCHAR pszSkyboxTextureFile[MAX_PATH] = {};
StringCchPrintf(pszSkyboxTextureFile, MAX_PATH, _T("%sAssets\\sky_cube.dds"), pszAppPath);
//使用“Assets\\sky_cube.dds”时需要XMMATRIX(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1)乘以xmView
StringCchPrintf(pszSkyboxTextureFile, MAX_PATH, _T("%sAssets\\Sky_cube_1024.dds"), pszAppPath);
ID3D12Resource* pIResSkyBox = nullptr;
GRS_THROW_IF_FAILED(LoadDDSTextureFromFile(
......@@ -1462,8 +1464,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
XMMATRIX xmProj = XMMatrixPerspectiveFovLH(XM_PIDIV4
, (FLOAT)iWndWidth / (FLOAT)iWndHeight, 1.0f, 20000.0f);
XMMATRIX xmSkyBox = XMMatrixMultiply(XMMATRIX(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1), xmView);
//使用“Assets\\sky_cube.dds”时需要XMMATRIX(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1)乘以xmView
XMMATRIX xmSkyBox = xmView;// XMMatrixMultiply(XMMATRIX(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1), xmView);
xmSkyBox = XMMatrixMultiply(xmSkyBox, xmProj);
xmSkyBox = XMMatrixInverse(nullptr, xmSkyBox);
//设置Skybox的MVP
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册