我正在开发一个关于增强现实的项目,使用一个标记(它是一个棋盘),从网络摄像头获取图像并将2D/3D对象插入棋盘平面(实时).
通过使用openCV,我能够检测到棋盘角落并绘制它.
我使用Direct3D渲染帧(通过使用正交投影),以便稍后我可以使用它来投影2d/3d对象.
现在我陷入了这个阶段.我知道有像ARToolkit等库,但我想了解它背后的技术和算法.如何找到可以将3D对象映射到棋盘平面的变换矩阵?
我正在使用对数深度算法,这导致someFunc(clipspace.z)被写入深度缓冲区并且没有隐式透视分割.
我正在进行RTT /后处理,所以稍后在片段着色器中我要重新计算eyespace.xyz,给定ndc.xy(来自片段坐标)和clipspace.z(来自someFuncInv()对存储在深度缓冲区中的值) .
请注意,我没有clipspace.w,并且我的存储值不是clipspace.z/clipspace.w(就像使用固定函数深度时那样) - 所以有些东西......
float clip_z = ...; /* [-1 .. +1] */
vec2 ndc = vec2(FragCoord.xy / viewport * 2.0 - 1.0);
vec4 clipspace = InvProjMatrix * vec4(ndc, clip_z, 1.0));
clipspace /= clipspace.w;
Run Code Online (Sandbox Code Playgroud)
......在这里不起作用.
那么有没有办法从clipspace.xyz中计算clipspace.w,给定投影矩阵或它是反向的?
我最近一直在使用计算着色器,我正在尝试确定设置[numthreads(x,y,z)]和调度调用的最佳方法.我的演示窗口是800x600,我每像素启动1个线程.我正在进行2D纹理修改 - 没有太重.
我的第一次尝试是指定
[numthreads(32,32,1)]
Run Code Online (Sandbox Code Playgroud)
我的Dispatch()调用总是如此
Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)
Run Code Online (Sandbox Code Playgroud)
因此,对于第一个实例
Dispatch(25,19,1)
Run Code Online (Sandbox Code Playgroud)
这个速度为25-26 fps.然后我减少到[numthreads(4,4,1)],运行速度为16 fps.将它增加到[numthreads(16,16,1)]开始了大约30 fps的良好结果.使用Y线程组编号[numthreads(16,8,1)]进行操作,设法将其推送到32 fps.
我的问题是有没有一种最佳的方法来确定线程数,这样我可以最有效地利用GPU,或者只是好的试验和错误?
我正在尝试在 Direct3D 中将 2D 图像绘制到屏幕上,我假设必须通过将纹理映射到投影以填充屏幕的矩形广告牌多边形来完成。(我不感兴趣或不能使用 Direct2D。)我在 SDK 中找到的所有纹理信息都描述了从文件加载位图并分配纹理以使用该位图,但我还没有找到操作的方法一个像素一个像素的位图纹理。
我真正想要的是一个函数,例如
void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);
如果我不能直接在纹理对象中设置像素,我是否需要保留一个作为位图的 DWORD 数组,然后将纹理分配给每一帧?
最后,虽然我最初假设我将在 CPU 上执行此操作,但每像素颜色计算可能也可以在 GPU 上完成。HLSL 代码是设置纹理中单个像素的颜色,还是像素着色器仅用于修改显示像素?
谢谢。
在使用XAudio2和Direct3D9/10的应用程序中显示视频(有声!)的最佳/最简单方法是什么?
至少它需要能够流式传输更大的视频,并注意窗口宽高比可能与视频不同的事实(例如通过添加信箱),尽管理想情况下我喜欢将视频嵌入到视频中的能力一个3D场景.
我当然可以设法将每个帧加载到纹理中,一旦渲染就丢弃/重复使用纹理,并通过XAudio2单独播放音频,但是除了编写至少一种格式的加载器之外,还必须处理喜欢同步视频和音频组件之类的东西,所以希望有一个更好的解决方案,甚至是现成的免费解决方案(二进制形式的商业发行,动态链接在LGPL的情况下很好).
我目前在java中重写了一个旧的Visual Basic应用程序,很大一部分工作涉及用jogl替换Direct3d.
由于我没有处理Direct3d的经验,只有使用Opengl的经验很少,我仍然坚持为api调用寻找合适的替代品.
有没有好的指南/教程或参考?
编辑:
附加信息:
我编写了一个模拟器,我正在移植到Linux.目前我正在使用Direct3D 11,我正在移植到OpenGL(我现在正在Windows上运行).我渲染到1024x1024纹理,我每帧上传到内存(原始硬件并不适合现代硬件加速,所以我只是用软件完成).但是,我发现在OpenGL中上传纹理要慢很多.
在Direct3D中,每帧上传纹理会使帧速率从416降至395(下降5%).在OpenGL中,它从427下降到297(下降30%!).
这是我的绘图功能的相关代码.
Direct3D的:
D3D11_MAPPED_SUBRESOURCE resource;
deviceContext_->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
uint32_t *buf = reinterpret_cast<uint32_t *>(resource.pData);
memcpy(buf, ...);
deviceContext_->Unmap(texture, 0);
Run Code Online (Sandbox Code Playgroud)
OpenGL的:
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA,
GL_UNSIGNED_BYTE, textureBuffer);
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议可能导致这种放缓的原因吗?
如果它有任何可能性,我使用NVIDIA GeForce GTX 550 Ti运行Windows 7 x64.
如何在DirectX中查询GPU使用情况?特别是DirectX 11.如果有人这样做过,你能提供我的代码片段吗?
我还没有在这里使用更复杂的CB,但据我所知,我的C++对齐和打包必须与HLSL所期望的相匹配.所以我正在试图找出规则,所以我可以预测它的布局C++ struct与HLSL预期相匹配.
我正在做一些测试,Vertex Shader v5看看输出中产生的包装,并在下面使用了这个结构vs.hlsl:
cbuffer conbuf {
float m0;
float m1;
float4 m2;
bool m3[1];
bool m4[4];
float4 m5;
float m6;
float4 m7;
matrix m8;
float m9;
float m10;
float4 m11[2];
float m12[8];
float m13;
};
Run Code Online (Sandbox Code Playgroud)
它产生了以下输出(在Header File NameVC++ Project HLSL设置中):
cbuffer conbuf {
float m0; // Offset: 0 Size: 4
float m1; // Offset: 4 Size: 4
float4 m2; // Offset: 16 Size: 16
bool m3; …Run Code Online (Sandbox Code Playgroud) 我正在开发“ 3d桌面” directx应用程序,该应用程序需要在DirectX(11)的矩形表面上以2D纹理的形式显示桌面窗口的当前内容(例如“计算器”)。我太亲密了,但实际上还是在屏幕截图BMP-> Texture2D步骤中挣扎。我确实有屏幕截图-> HBITMAP和DDSFile->渲染纹理成功工作,但是无法完成屏幕截图->渲染纹理。
到目前为止,我已经使用“将窗口捕获为屏幕截图”位:
RECT user_window_rectangle;
HWND user_window = FindWindow(NULL, TEXT("Calculator"));
GetClientRect(user_window, &user_window_rectangle);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
UINT screenshot_width = user_window_rectangle.right - user_window_rectangle.left;
UINT screenshot_height = user_window_rectangle.bottom - user_window_rectangle.top;
hbmp = CreateCompatibleBitmap(hdcScreen, screenshot_width, screenshot_height);
SelectObject(hdc, hbmp);
PrintWindow(user_window, hdc, PW_CLIENTONLY);
Run Code Online (Sandbox Code Playgroud)
至此,我有了HBITMAP hbmp引用的窗口位图。
我的代码也可以将DDS文件渲染为DirectX / 3D矩形上的纹理,这也是可行的:
ID3D11Device *dev;
ID3D11DeviceContext *dev_context;
...
dev_context->PSSetShaderResources(0, 1, &shader_resource_view);
dev_context->PSSetSamplers(0, 1, &tex_sampler_state);
...
DirectX::TexMetadata tex_metadata;
DirectX::ScratchImage image;
hr = LoadFromDDSFile(L"Earth.dds", DirectX::DDS_FLAGS_NONE, &tex_metadata, image);
hr = CreateShaderResourceView(dev, image.GetImages(), image.GetImageCount(), tex_metadata, …Run Code Online (Sandbox Code Playgroud)