directx-11 相关问题

DirectX 11是Microsoft的DirectX API的第11个版本,用于开发和处理与多媒体相关的任务,例如Microsoft平台上的游戏编程,3D可视化和视频。 DirectX 11可在Windows Vista,Windows 7,Windows 8,Windows 10和Xbox One上运行。

这是我使用的函数

这是将点变成相机视图空间的地方,所有点都是正确定位的。 auto vec = MainSingleton::Get()->mySceneManager->GetCamera()->GetCameraData().GetFrustumCornersWorldSpace(); std::vector<std::pair<CU::Vector3f, CU::Vector3f>> minMax; std::vector <CU::Matrix4x4f> views; constexpr float zMult = 100.0f; for (auto& v : vec) { CU::Vector3f center; for (auto& vP : v) { center += vP; } center /= static_cast<float>(v.size()); views.emplace_back(CU::Matrix4x4f::LookAt(center + myDirectionalLights.front()->GetData().direction, center, CU::Vector3f(0.f, 1.f, 0.f))); //views.back().SetRow(4, myDirectionalLights.front()->gameObject->GetTransform().GetPosition().ToVector4(1)); minMax.emplace_back(); minMax.back().first.x = std::numeric_limits<float>::max(); minMax.back().first.y = std::numeric_limits<float>::max(); minMax.back().first.z = std::numeric_limits<float>::max(); minMax.back().second.x = std::numeric_limits<float>::lowest(); minMax.back().second.y = std::numeric_limits<float>::lowest(); minMax.back().second.z = std::numeric_limits<float>::lowest(); for (auto& vP : v) { const auto trf = vP * views.back(); minMax.back().first.x = std::min(minMax.back().first.x, trf.x); minMax.back().first.y = std::min(minMax.back().first.y, trf.y); minMax.back().first.z = std::min(minMax.back().first.z, trf.z); minMax.back().second.x = std::max(minMax.back().second.x, trf.x); minMax.back().second.y = std::max(minMax.back().second.y, trf.y); minMax.back().second.z = std::max(minMax.back().second.z, trf.z); } if (minMax.back().first.z < 0) minMax.back().first.z *= zMult; else minMax.back().first.z /= zMult; if (minMax.back().second.z < 0) minMax.back().second.z /= zMult; else minMax.back().second.z *= zMult; } 最终,这是我用给定的framebuffer渲染并渲染到阴影图的地方 std::wstringstream stream; stream << "Shadow map nr: " << index; myRHI->BeginRenderTag(stream.str().c_str()); GraphicsEngine::GetRHI()->GetContext()->ClearDepthStencilView(myShadowMaps[index]->GetDepthStencilView().Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); ID3D11ShaderResourceView* nullView = nullptr; GraphicsEngine::GetRHI()->GetContext()->PSSetShaderResources(105 + index, 1, &nullView); GraphicsEngine::GetRHI()->GetContext()->OMSetRenderTargets(0, nullptr, myShadowMaps[index]->GetDepthStencilView().Get()); CU::Camera camera; auto val = miniMax[index]; //camera.GetSettings().myNearPlane = 10; //camera.GetSettings().myFarPlane = 500000; //float x = val.second.x - val.first.x; //float y = val.second.y - val.first.y; float left = val.first.x; float right = val.second.x; float bottom = val.first.y; float top = val.second.y; float nearPlane = val.first.z; float farPlane = val.second.z; camera.Init(left, right, bottom, top, nearPlane, farPlane); auto& timer = CU::Time::Get(); myFrameBuffer.myCameraPosition = view[index].GetRowVector(4); myFrameBuffer.myInverseViewMatrix = view[index].GetInverse(); myFrameBuffer.myProjectionMatrix = camera.GetClipSpace(); myFrameBuffer.myScreenResolution = GetResolution(); myFrameBuffer.myDeltaTime = timer.GetDeltaTime(); myFrameBuffer.myUnscaledDeltaTime = timer.GetDeltaTimeUnscaled(); myFrameBuffer.myTotalTime = timer.GetTotalTime(); myFrameBuffer.myForward = cam->GetData().direction; UpdateAndSetConstantBuffer(ConstantBufferType::FrameBuffer, myFrameBuffer); //this->SetFrameBuffer(cam->GetShadowCamera()); //auto& transform = cam->GetShadowCamera()->GetTransform(); //myFrameBuffer.myCameraPosition = transform.GetPosition().ToVector4(1.f); //myFrameBuffer.myInverseViewMatrix = cam->GetShadowCamera()->GetView().GetInverse(); //myFrameBuffer.myForward = transform.Forward().GetNormalized(); D3D11_VIEWPORT viewport = {}; viewport.TopLeftX = 0; viewport.TopLeftY = 0; viewport.Width = 4096; viewport.Height = 4096; viewport.MaxDepth = 1.0f; myRHI->GetContext()->RSSetViewports(1, &viewport); GraphicsEngine::GetRHI()->GetContext()->PSSetShader(nullptr, nullptr, 0); 在这里澄清是getfrustum角函数 std::vector< std::vector<CU::Vector3f>> Camera::GetFrustumCornersWorldSpace() { std::vector< std::vector<CU::Vector3f>> frustumCorners; const Vector3f up = myTransform.Up(); const Vector3f right = myTransform.Right(); const int nbSplits = 3; std::vector<float> splitpoints{10, 100, 300, 1000}; //for (int i = 0; i < nbSplits; i++) //{ // float ratio = static_cast<float>(i) / nbSplits; // splitpoints[i] = mySettings.myNearPlane + ratio * (mySettings.myFarPlane - mySettings.myNearPlane); //} for (int i = 1; i < nbSplits + 1; i++) { float fakeNearPlane = splitpoints[i - 1]; float fakeFarPlane = splitpoints[i]; const float farHeight = std::tan(mySettings.myFov * Deg2Rad * 0.5f) * fakeFarPlane; const float farWidth = farHeight * (16.f / 9.f); const float nearHeight = std::tan(mySettings.myFov * Deg2Rad * 0.5f) * fakeNearPlane; const float nearWidth = nearHeight * (16.f / 9.f); const Vector3f farCentre = myTransform.GetPosition() + myTransform.Forward() * fakeFarPlane; const Vector3f ftr = farCentre + up * farHeight + right * farWidth; //Far Top Right const Vector3f ftl = farCentre + up * farHeight - right * farWidth; //Far Top Left const Vector3f fbr = farCentre - up * farHeight + right * farWidth; //Far Bottom Right const Vector3f fbl = farCentre - up * farHeight - right * farWidth; //Far Bottom Left frustumCorners.emplace_back(); frustumCorners.back().emplace_back(ftr); frustumCorners.back().emplace_back(ftl); frustumCorners.back().emplace_back(fbr); frustumCorners.back().emplace_back(fbl); const Vector3f nearCentre = myTransform.GetPosition() + myTransform.Forward() * fakeNearPlane; const Vector3f ntr = nearCentre + up * nearHeight + right * nearWidth;//Near Top Right const Vector3f ntl = nearCentre + up * nearHeight - right * nearWidth;//Near Top Left const Vector3f nbr = nearCentre - up * nearHeight + right * nearWidth;//Near Bottom Right const Vector3f nbl = nearCentre - up * nearHeight - right * nearWidth;//Near Bottom Left frustumCorners.back().emplace_back(ntr); frustumCorners.back().emplace_back(ntl); frustumCorners.back().emplace_back(nbr); frustumCorners.back().emplace_back(nbl); } return frustumCorners; } 图像输出是这个 infinitefov 我尝试修改夹矩阵 乘以定向光方向以使其更远 我尝试过倒数,并在剪辑空间/投影和反矩阵上进行转介,但是什么都没有用 我通过尝试DX 11个样本链接来使它SO,它有助于说我创建拼字摄像头时,我为剪辑空间切换x和y值,甚至我忘了附加void Camera::Init(float left, float right, float bottom, float top, float nearPlane, float farPlane) { mySettings.myUsePerspective = false; myInverse = myTransform.GetMatrix().GetFastInverse(); myClipSpace(1, 1) = 2.0f / (right - left); myClipSpace(2, 2) = 2.0f / (top - bottom); myClipSpace(3, 3) = 1.0f / (farPlane - nearPlane); myClipSpace(4, 4) = 1.0f; myClipSpace(4, 1) = -(right + left) / (right - left); myClipSpace(4, 2) = -(top + bottom) / (top - bottom); myClipSpace(4, 3) = -nearPlane / (farPlane - nearPlane); }

回答 0 投票 0

等待副本操作从Backbuffer到DX11中的登台缓冲区?

IM挂上DX11的呼叫。在每个帧中,我想将Backbuffer的内容复制到CPU缓冲区中。这可以完成创建登台缓冲区。 Backb的内容...

回答 1 投票 0

如何使用 DirectX 11 截取屏幕截图?

我正在为 DX11 游戏编写插件,我需要截屏并将其保存到文件中。我发现了一些使用 D3DX11SaveTextureToFile 函数的代码片段,但我就是无法将其实现......

回答 1 投票 0

DirectX11 丢弃/剪辑像素 MSAA

我正在使用计数 8 的示例描述创建颜色和深度纹理。渲染几何体时,MSAA 似乎运行良好。 然而,在我基于精灵的着色器中,我渲染...

回答 1 投票 0

Direct2D 导致 D3D 出现 LiveObjects 警告

我正在尝试使用 Direct2D 和 Direct3D 互操作性,如 Microsoft Docs 中所述 我正在使用 C# 和 Silk.Net ,所以我制作了这个类,它封装了 D2D1 和 DWrite Logic ,即...

回答 1 投票 0

如何复制格式不兼容的资源(DXGI_FORMAT_R10G10B10A2_UNORM 到 DXGI_FORMAT_R8G8B8A8_UNORM )

我想将 ID3D11Texture2D 从一个设备复制到另一个设备(无 CPU 复制)并将格式从 DXGI_FORMAT_R10G10B10A2_UNORM 更改为 DXGI_FORMAT_R8G8B8A8_UNORM 或替代 CUDA 兼容形式...

回答 1 投票 0

通过 DXGI FLIP SwapChain 强制使用独立翻转模式

我目前面临 DXGI 交换链 (DirectX 11) 的问题。我的 C++ 应用程序显示(实时)视频,我的目标是最大限度地减少延迟。我没有要处理的用户输入。 为了减少延迟我

回答 1 投票 0

加载骨架和动画时我做错了什么?

我正在尝试使用 assimp 加载动画和骨架。我不确定我的矩阵乘法是否正确,或者我是否在某处缺少逆或转置。 我的引擎使用的是左...

回答 1 投票 0

如何检查DirectX支持?

我的游戏运行 DirectX 11。我需要检查我的电脑是否支持 DirectX 11 以及它是否与旧版 DirectX 版本兼容。 如果我的电脑只有较旧的目录,我使用 DirectX 11 的游戏是否可以运行...

回答 1 投票 0

Dx11屏幕捕捉HDR问题

我使用以下代码来捕获屏幕,但是当捕获HDR显示时,它会曝光过度。有没有办法将HDR图像转换为SDR,或者其他方法? 我尝试改变...

回答 1 投票 0

DirectX 11 纹理过滤器线性/点闪烁

我使用 C++ 在 Windows 10 x64 上编写了一个小型 DirectX 11 应用程序。 现在我想渲染一些低分辨率纹理(例如 16px * 16px),而不会失去放大倍数的清晰度(在游戏中如何

回答 3 投票 0

混合两个ID3D11Texture2D

我有两个 ID3D11Texture2D 纹理。从字节数组创建 D3D11_SUBRESOURCE_DATA initData = { 0 }; initData.pSysMem = (const void*)pArrayOfBytes1; initData.SysMemPitch = 桌面.right * s...

回答 1 投票 0

DirectX 11 每个网格都以 0 的形式绘制到深度缓冲区,导致实际上没有深度测试

据我所知,我已经正确设置了深度测试,但是对象只是从头到尾绘制的。我查看了图形调试器,看起来当绘制网格时......

回答 1 投票 0

在 Direct3D 11 中禁用切换全屏(alt+enter)

如标题所写,怎么样? 我认为 DXGI_SWAP_CHAIN_DESC::flags 中的 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH 对此负责,但即使我将 DXGI_SWAP_CHAIN_DESC::flags 设置为 0,...

回答 1 投票 0

C++ Directx 11 环境照明

我目前在 Directx 11 中遇到照明问题,实际上是环境照明问题。这是代码: cbuffer常量缓冲区 { 浮动4x4最终; 浮动4x4旋转; // 旋转...

回答 2 投票 0

D3D11 如何正确从 swap_chain/渲染目标复制

我一直在尝试编写一个函数,该函数只需获取后台缓冲区/帧缓冲区并将其内容保存到文件中。 内部无符号字符 *r_get_backbuffer(Arena *arena, GFX_Window *window, int wi...

回答 1 投票 0

如何确定 DirectX 11 驱动程序挂起的原因

我正在开发一个 QT 应用程序,我已将 DirectX 11 集成到自定义小部件中。该应用程序呈现滚动显示 - 从文件中读取的数据的图形表示。 ...

回答 2 投票 0

如何在DirectX11中正确链接几何着色器

我试图将几何着色器引入到我的管道中,但它似乎无法被识别,并且顶点着色器尝试直接进入像素着色器。 我收到此错误消息: D3D11 E...

回答 1 投票 0

与第 9 版相比,DirectX 11 中缺少一些属性

目前,我正在将旧代码从 DirectX 第九版移植到较新的第十一版,并且在寻找现有属性和功能的类似物方面遇到了一些困难。

回答 1 投票 0

Direct3D 11 和 2D:纹理显示错误

我仍在尝试改进有关 Direct3D 11 2D 的测试程序,无需任何其他库(请参阅 direct3d 11 和 2D:将顶点坐标作为 int 而不是 float 传递)。 我现在想展示...

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.