我使用DirectInput来处理输入设备,我枚举每个设备上的设备和元素.
在我的游戏手柄上使用模拟棒时,它们会报告0-65535范围内的值.这是始终为所有类型的绝对轴的情况下?
如果没有:有没有办法找出DX8输入元素的范围DIDEVICEOBJECTDATA :: dwData(用DIDFT_ABSAXIS枚举)?我能想到的唯一另一个选择是在我的应用程序中使用一些自制的内部校准,这听起来也是80年代的真实.
我正在从一本关于游戏编程的书中学习DirectX,它使用以下方法进行游戏循环:
long int start = GetTickCount();
while(true)
    GameRun();
void GameRun()
{
     if(GetTickCount() - start >= 30)
         //do stuff
}
start无论时间是什么,这都是平等的(我猜测得到滴答计数给出了自程序启动以来'滴答'的数量),然后,30个滴答之后,完成所有AI,渲染等.
我的问题是,首先执行所有AI等不是更有效率,然后,如果时间剩余,等到帧需要更改?
那么,保持稳定帧速率的更好方法是什么?(最好只使用我已用于声音,图像和输入的DirectX标题(如d3d9.h))
并且,在相关的说明中,GetTickCount()究竟做了什么,以及'tick'有多长
我想以安静模式安装DirectX 9c用户包.有没有像/ quiet/q/qb等选项.这些都没有.
注意:
用这个文件DXSETUP.exe/q
不是提取器文件directx_9c_redist.exe/q(这很好.)
我正在尝试使用directx进行屏幕截图.我尝试了几页的代码,解释了如何但总是得到黑屏幕.如果有人可以帮助我,我将不胜感激.
我的代码是:
int _tmain(int argc, _TCHAR* argv[])
{
    IDirect3DDevice9* g_pd3dDevice;
    //SaveScreenShot("test.bmp",D3DXIFF_BMP);   
    IDirect3DSurface9* pSurface=NULL;
    //IDirect3DSurface9* pSource=NULL;
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferWidth = 1280;
    d3dpp.BackBufferHeight = 1024;
    d3dpp.hDeviceWindow = GetDesktopWindow();
    d3dpp.FullScreen_RefreshRateInHz=0;
    d3dpp.MultiSampleQuality=0;
    IDirect3D9* direct=Direct3DCreate9(D3D9b_SDK_VERSION);
    direct->CreateDevice(D3DADAPTER_DEFAULT,
                         D3DDEVTYPE_HAL,
                         GetDesktopWindow(),
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                         &d3dpp,&g_pd3dDevice);
    //g_pd3dDevice->GetRenderTarget(0,&pSource);
    g_pd3dDevice->CreateOffscreenPlainSurface(1280, 1024,
        D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL);
    g_pd3dDevice->GetFrontBufferData(0, pSurface);
    /*g_pd3dDevice->GetRenderTargetData(pSource,pSurface);
    g_pd3dDevice->GetRenderTargetData(pSource,pSurface);*/
    D3DXSaveSurfaceToFile("Desktop.jpg",D3DXIFF_JPG,pSurface,NULL,NULL);
    pSurface->Release();
    //pSource->Release();
    return 0;
}
为什么在析构函数中的IWICImagingFactory对象上调用继承的IUnknown :: Release()函数会导致在对象的虚函数表(__vfptr)中显示每个条目的"CXX0030:错误:无法计算表达式"?
这是参考我发布的早期问题,但我已经意识到问题只发生在析构函数中.虚拟功能表在我检查过的任何其他地方都有效.但是,一旦在析构函数中,所有条目都显示CXX0030错误,并且尝试调用继承的IUknown :: Release()失败.
编辑:这是一些代码来演示:
HRESULT DemoApp::CreateDeviceIndependentResources()
{
HRESULT hr;
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &mpDirect2DFactory);
if (SUCCEEDED(hr))
{
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&mpWICFactory)
        );
}
//CoCreateInstance returns S_OK.
//Other unrelated code here.
}
HRESULT DemoApp::CreateDeviceResources()
{
HRESULT hr;
//Other unrelated code here for creating device-dependant resources.
//mpBackgroundBitmap is a ID2D1Bitmap*.
    if(SUCCEEDED(hr))
    {
        hr = LoadBitmapFromFile(
            mpRenderTarget,
            mpWICFactory,
            L".\\background.png",
            0,
            0,
            &mpBackgroundBitmap);
    }
}
//The below LoadBitmapFromFile() code is taken directly from an MSDN sample.
//I didn't write …创建一些常量缓冲区后,其中一些缓冲区开始无法正确初始化.
使用名为MiscStream的结构创建一个常量缓冲区,该结构定义如下:
struct MiscStream {
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
初始化为:
D3D11_BUFFER_DESC dx_misc_buffer_desc;
ID3D11Buffer* dx_misc_buffer;
ZeroMemory(&dx_misc_buffer_desc,sizeof dx_misc_buffer_desc);
    dx_misc_buffer_desc.BindFlags=D3D11_BIND_CONSTANT_BUFFER;
    dx_misc_buffer_desc.Usage=D3D11_USAGE_DYNAMIC;
    dx_misc_buffer_desc.ByteWidth=sizeof(MiscStream);
    dx_misc_buffer_desc.StructureByteStride=0;
    dx_misc_buffer_desc.CPUAccessFlags=D3D11_CPU_ACCESS_WRITE;
    dx_misc_buffer_desc.MiscFlags=0;
hr=dx_device->CreateBuffer(&dx_misc_buffer_desc,NULL,&dx_misc_buffer);
hr将作为E_INVALIDARG返回,程序将失败.
许多其他常量缓冲区以这种方式设置,但它们的结构中都有向量和矩阵.
我将MiscStruct更改为
struct MiscStream {
    D3DXVECTOR3 __r;
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
它没有错误地工作.
是否有最小结构尺寸?怎么了?
常量缓冲区,在顶点着色器源中声明
cbuffer c_buffer : register(b0)
{
    matrix <float, 4, 4> u_mvpMatrix;
    matrix <float, 4, 4> m44;
    matrix <float, 3, 3> m33;
    matrix <float, 2, 3> m23;
    matrix <float, 3, 2> m32;
    matrix <float, 1, 3> m13;
}
用于编译着色器的命令
fxc /nologo /E main /T vs_4_0_level_9_3 /Fh vertex_bytes.h /Vn bytes
最后,生成的vetex_output.h中的注释
// Buffer Definitions: 
//
// cbuffer c_buffer
// {
//
//   float4x4 u_mvpMatrix;              // Offset:    0 Size:    64
//   float4x4 m44;                      // Offset:   64 Size:    64 [unused]
//   float3x3 m33;                      // …我使用Direct2D从文本布局开始渲染文本
HRESULT hr = m_spWriteFactory->CreateTextLayout(
        m_wsText.c_str( ),
        m_wsText.length( ),
        m_spWriteTextFormat.Get( ),
        m_rect.right - m_rect.left - m_spacing.right - m_spacing.left,
        m_rect.bottom - m_rect.top - m_spacing.top - m_spacing.bottom,
        &m_spTextLayout
        );
然后将其渲染为我稍后与Direct3D一起使用的位图
m_sp2DDeviceContext->DrawTextLayout(
                D2D1::Point2F( m_spacing.left, m_spacing.top ),
                m_spTextLayout.Get( ),
                m_spTextBrush.Get( )
                );
我想画一条简单的闪烁线作为插入符号.我知道如何绘制线条以及如何使其显示/消失.
问题:如何获得插入线的起点和终点坐标?
简化:如果它是很容易假设文本由一个只有一行,那么也没关系.但是,当然会有更普遍的解决方案.
我有一个特定的要求,即能够从源视频中选择任意矩形区域,并将该区域(在特定时间范围内)保存到单独的文件中.
理想情况下,API将支持C#/ .NET,但我们已准备好在C++中使用它,如果这样可以产生更好的最终产品.
该软件需要在Windows机器上运行.
我研究过Direct Show Editing Services和Media Foundation.我发现有相互矛盾的信息表明DSES已被弃用,但后来使用DSES而不是MF,因为MF并没有那么关注视频编辑.
我还应该研究其他任何API吗?
你能为手头的任务推荐上述任何一种API吗?
提前致谢!
directx ×10
c++ ×5
buffer ×2
directx-11 ×2
windows ×2
c# ×1
com ×1
direct2d ×1
direct3d9 ×1
directinput ×1
directshow ×1
enumeration ×1
frame-rate ×1
hlsl ×1
installer ×1
offset ×1
screenshot ×1
vector ×1
visual-c++ ×1