我打算学习如何为第三方PC游戏(免费,合法)开发自定义HUD的基础知识,我的目的是开发一个应用程序,在屏幕上绘制/显示其他信息(通过读取mem地址).
所以我研究了专业项目,我发现使用SharpDX库的TurboHUD使用基于DirectX的库在屏幕上绘制对象/覆盖/文本,结果非常好(绘制时不会失去性能)屏幕上的多个对象),但是,由于该项目的作者没有提供理解他们如何做到这一点的来源,所以我试图自己学习使用相同的专业技术.
如果我走错路或者我错过了一些比SharpDX更好的替代方案来开发它,请告诉我.
我的主要问题是:
在C#或最好是VB.Net中,我如何使用SharpDX在屏幕上有效地绘制自定义字符串?
请注意,我可以将Form的难度设置为0,但我认为它应该存在正确的方式,并且我要求知道在"桌面"屏幕上直接绘制的正确方法.
我的期望是推出PC游戏,然后启动我的自定义HUD,它将绘制"桌面"屏幕表面以添加游戏的其他信息,我希望你了解我.
我应该澄清一下,我对这种DirectX库完全缺乏经验,我正在使用SharpDX示例包来尝试学习它的用法.
由于所有样本都在C#中,因此在VB.Net下学习它的难度更大.
在SharpDX示例包中有一个' AdvancedTextRenderingApp'C#项目,但正如它的名字所说它是一个高级示例,它也是一个自定义Form(a SharpDX.Windows.RenderForm)实例,用于绘制该Form.
这是我提到的C#项目的VB.Net代码翻译:
只是打算对我所做的研究发表评论:
我最近发现了这个有用的GitHub存储库,然而,它无法在Visual Studio 2015中编译(因为缺少命名空间使用,添加它们会产生更多的编译器错误),它也面向高级SharpDX用户,并在分析完整样本后仍然不知道如何在第三部分流程窗口的表面上编写/绘制...而且C#语法让我对SharpDX的使用有了全面的了解,因为作者也做了大量的SharpDX自定义实现成员,然后......我不仅仅是失去了所有这些例子.
该官员SharpDX样品是另一种,这似乎是非常有用的...也许适用于高级用户的那些东西.一些示例似乎演示了如何渲染自定义窗口/表面(使用500个繁琐且难以理解的代码行来完成它.而且他们的" Hello world "示例对我来说是一场噩梦.)但是,我想要做的就是我在我的问题中解释的是在另一个进程的现有窗口的表面上绘制,并且我知道可能需要使用SharpDX从头开始渲染"表面",然后将其定位在目标窗口中,然后使表面看不见,然后画上它,但我不知道该怎么做.
我已经将我的C#游戏从OpenTK(OpenGL)转换为SharpDX(DirectX)并从Visual Studio 2010开始运行.我还在Windows 8开发人员预览版中使用Metro中的Visual Studio 11运行它.然而,Metro构建仍然缺乏纹理,因此我的多边形现在只是着色.问题是Metro DLL中没有用于加载图像的方法.Windows Store App中的Texture2D类(继承自Resource类)中缺少这些方法:
SharpDX.Direct3D11.Resource.FromStream
SharpDX.Direct3D11.Resource.FromFile
SharpDX.Direct3D11.Resource.FromMemory
Run Code Online (Sandbox Code Playgroud)
有谁知道这些最终是否会在Metro中实施?或者我可以使用另一种方法吗?请记住,在此之前我从来不知道关于DirectX或SharpDX的事情,所以我仍然非常湿透.
为SharpDX寻找任何类型的帮助或信息并不容易,这是一种耻辱,因为它似乎是使用C#在Metro中使用3D的一个很好的解决方案.
可以使用DirectWrite将文本渲染到WinForm应用程序中的PictureBox吗?
我正在使用SharpDX并且已经通过DirectWrite示例试图构建我能做到的最简单的工作案例.
我创建了一个Form并且只添加了一个pictureBox.然后是以下代码.表单显示,但PictureBox没有任何可见.
任何指导都将非常感谢.
谢谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
//using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SharpDX.Direct2D1;
using SharpDX.DXGI;
using SharpDX;
using SharpDX.DirectWrite;
using AlphaMode = SharpDX.Direct2D1.AlphaMode;
using Factory = SharpDX.Direct2D1.Factory;
namespace d2dwTextEdit
{
public partial class Form1 : Form
{
public Factory Factory2D { get; private set; }
public SharpDX.DirectWrite.Factory FactoryDWrite { get; private set; }
public WindowRenderTarget RenderTarget2D { get; private set; }
public SolidColorBrush SceneColorBrush { get; private set; }
public …Run Code Online (Sandbox Code Playgroud) 我开始使用DirectX(和SharpDX,因此仅在C#/ hlsl中编程)并且我正在尝试构建自己的相机类.它应该是可旋转的,允许向前和向后移动以及"侧向"运动(经典的第一人称运动通常映射到A和D,在我的情况下加上和向下).为了方便bugfixing模型和世界空间是在我的情况一样,透视投影尚未实现,如旋转的摄像头,和我的相机应该是正Z轴看(到屏幕).我的错误修正模型是一个简单的四边形,宽度和高度为1.f,z = 0并且在屏幕上居中.
为了便于使用,我找到了DirectX Matrix.LookAtLH()并使用它构建我的矩阵,用于从世界到视图坐标的平移,基于我的相机在世界坐标中的位置,向上矢量(现在 - 没有旋转 - 总是正Y轴)和世界坐标中的目标点.
我的(顶点)着色器使用与此矩阵的简单乘法:
output.position = mul(position, worldToView);
LookAt-Matrix计算如下:
Matrix.LookAtLH(vec3(0, 0, -1), vec3(0, 0, 0.5f), vec3(0, 1, 0))
得到这张图片:

现在我想将相机移到右边,在这种情况下,将1.f添加到它的X坐标.我的预期结果与之前的四元组相同,向左移动了一点.
我构建了一个新的LootAt矩阵,通过相同的向量移动眼睛坐标和目标坐标:
Matrix.LookAtLH(vec3(1, 0, -1), vec3(1, 0, 0.5f), vec3(0, 1, 0))
结果如下:

我移动相机越多越好,但屏幕中心仍保持四边形的中心.这与我对潜在的误解有关Matrix.LookAtLH吗?
感谢这个答案/sf/answers/961433651/我能够知道按下按钮的时间或旋转方向盘的时间.现在我的问题是如何将效果发送到设备?例如,当我正在玩游戏时,如果我发生碰撞,车轮会振动.我怎么能让方向盘振动?
我相信我需要做的就是Start()效果(http://sharpdx.org/documentation/api/t-sharpdx-directinput-effect).SharpDX.DirectInput.Joystick类似乎没有一个方法可以返回所有效果.有一个方法被调用,GetEffects但该方法返回一个EffectInfo对象集合.游戏如何向操纵杆发送命令?
我试图用SharpDx为Windows和Windows Phone 8.1编写游戏.但是当我尝试将Windows Phone 8.1版本添加到我已经存在的Windows 8.1游戏时,我收到一些错误并且应用程序不起作用.现在的问题是:对于Windows通用应用程序,是否存在XNA样式的SharpDx模板,例如我为我唯一的Windows 8.1游戏(来自SharpDx Visual Studio扩展)获得的模板?
我有一个使用SharpDX 2.5.0的C#项目,一切都运行正常.我转到SharpDX的最新稳定版本2.6.2.我的项目编译正常,但在运行时失败,因为它无法编译着色器.我正在使用这行代码:
var vertexShaderByteCode = ShaderBytecode.CompileFromFile(ShaderFileName, "Base_VS", "vs_4_0");
Run Code Online (Sandbox Code Playgroud)
无论着色器文件的实际内容是什么,它都会失败并出现以下错误:
path/to/my/shader.hlsl(1,1): error X3000: Illegal character in shader file
Run Code Online (Sandbox Code Playgroud)
我认为它与文件的UTF-8编码有关,但尝试各种编码并没有解决问题.有没有其他人遇到类似的问题或有建议?
我一直在研究用于创建游戏的好工具,我遇到了 Monogame、Sharpx 和 XNA。我对每个问题都有一些疑问:
当我创建一个新的 Windows 项目(它宣传它使用 DirectX 12)时,代码模板如下所示:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
Run Code Online (Sandbox Code Playgroud)我知道 Monogame 是 XNA 的重新实现,但“重新”部分在哪里?这段代码显示了使用 Microsoft 的 XNA 的 Monogame,甚至没有暗示 DirectX 12 的使用。
我觉得我对某些事情感到困惑并想要清楚。请记住,我对这些东西完全是个菜鸟,任何事情都有帮助!
我将MediaFoundation与 SharpDX一起使用,以便对来自桌面重复帧的视频文件进行编码。
我正在创建纹理并捕获屏幕。然后将此纹理传递给MFCreateVideoSampleFromSurface,调用一次。
/* creating the texture */
new Texture2D(/* device */,
new Texture2DDescription {
CpuAccessFlags = CpuAccessFlags.Read,
BindFlags = BindFlags.None,
Format = Format.B8G8R8A8_UNorm,
Width = /* width */,
Height = /* height */,
OptionFlags = ResourceOptionFlags.None,
MipLevels = 1,
ArraySize = 1,
SampleDescription = { Count = 1, Quality = 0 },
Usage = ResourceUsage.Staging
})
/* creating the sample */
Evr.CreateVideoSampleFromSurface(SourceTexture, out /* the sample */);
Run Code Online (Sandbox Code Playgroud)
初始化样本和纹理后,我正在调用IDXGIOutputDuplication::AcquireFrame() …
此代码每100毫秒运行一次.内存使用率不断增加,直到达到1.5 GB然后崩溃.
void takeScreenShot()
{
Surface s;
s = CaptureScreen();
pictureBox1.Image = new Bitmap(Surface.ToStream(s, ImageFileFormat.Bmp));
s.Dispose();
}
public Surface CaptureScreen()
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Device device = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters(width, height));
DisplayMode disp = device.GetDisplayMode(0);
Surface s = Surface.CreateOffscreenPlain(device, disp.Width, disp.Height, Format.A8R8G8B8, Pool.Scratch);
device.GetFrontBufferData(0, s);
return s;
}
Run Code Online (Sandbox Code Playgroud)