我想为Windows 8开发一款游戏,但由于不支持Xna,我真的不知道,如果使用像MonoGame这样的东西是好的 - 因为我觉得使用MonoDevelop没有任何意义使用OpenGL,而UI前端与DirectX一起运行.但是我的搜索和"apptivate.ms",他们仍然迫使开发人员使用MonoDevelop - 但为什么像微软这样的公司会这样做呢?
而且我不喜欢使用DirectX在C++中构建我的游戏,因为在我的情况下,它不是一个大游戏,而我最喜欢的语言(也就是我工作的语言)是C#..
顺便说一下,用OpenGL或C++编写这个游戏对我来说并不是什么大不了的事,因为我在过去的四年中有很多这方面的经验,但在这种情况下,我想要一个"快速"和"保存"像C#和图形框架的解决方案.
所以...也许某人有这些问题的答案:
我正在寻找一种在鼠标点读取像素颜色的方法.在OpenGL中,它是在绘制场景(或部分场景)后调用函数"glReadPixels"完成的.我想在后台制作一个简单的颜色拾取程序,用于识别3D空间中的形状/线条.
那么,在SharpDX(DirectX10/DirectX11)中是否有相同的方法/功能/建议?
我正试图让"SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate"工作.没有这个,我有一个很好的场景(Polygones上有纹理,对于Spaceshooter).我在过去的三年里完成了OpenGL Graphics,所以我认为它可能就像在OpenGL中一样简单 - 只需启用Blending并设置正确的Dst/Src模式.但是如果我设置一个新的BlendStateDescription,所有输出都是黑色,即使"RenderTarget [x] .IsBlendEnabled"设置为"false".我搜索了一个教程或其他东西,并找到一个 - 但它使用效果.所以我的问题很简单 - 我是否必须在SharpDX中使用技术和效果?没有其他方法可以简单混合?
这就是我所做的:
mBackBuffer = Texture2D.FromSwapChain<Texture2D>(mSwapChain, 0);
mRenderView = new RenderTargetView(mDevice, mBackBuffer);
mContext.OutputMerger.SetTargets(mDepthStencilView, mRenderView);
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = true;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].BlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
Run Code Online (Sandbox Code Playgroud)
并且,即使只是简单地做:
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;
Run Code Online (Sandbox Code Playgroud)
输出全是黑色..也许我只需更改像素着色器中的某些内容?
我想自己绘制和移动窗户(使用铬嵌入式框架).要做到这一点,我需要一个全局回调鼠标移动,在我的窗口外 - 所以我安装了一个低级鼠标钩:
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);
Run Code Online (Sandbox Code Playgroud)
钩子简单地抓取鼠标事件并调用"CallNextHookEx".这里没有问题,一切都按照要求行事.我现在的问题是:如果调试器中断或抛出异常,我就不能再移动鼠标..
我尝试在另一个线程中处理钩子,如下所示:
HANDLE mouseProcHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mouseProcessor, NULL, NULL, &dwMouseProcThread);
DWORD WINAPI Win32Application::mouseProcessor(LPVOID lpParm) {
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, ((Win32Application*)Application::getInstance())->hInstance, NULL);
MSG message;
while (GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
UnhookWindowsHookEx(hMouseLLHook);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这也无法解决问题.是否有解决方法,解决方案或其他方法来执行此操作?另外,我认为可能没有必要使用低级别的钩子,因为我只需要了解它的运行情况,如果我是最后一个,那就不会有问题,所以系统/其他进程可以处理首先是鼠标回调.
c# ×2
directx ×2
sharpdx ×2
windows-8 ×2
c++ ×1
opengl ×1
visual-c++ ×1
windows ×1
winrt-xaml ×1
xaml ×1