Articles of directx11

第一人称相机在角度扫射

我有一个简单的相机类在DirectX 11中工作,允许前进和左右旋转。 我试图实施扫射,但有一些问题。 当没有相机旋转时,扫射工作,所以当相机开始在0,0,0。但是,在任何一个方向旋转相机后,似乎在一个角度或倒置或只是一些奇怪的东西strafe。 这是一个上传到Dropbox的video,显示了这种行为。 https://dl.dropboxusercontent.com/u/287​​3587/IncorrectStrafing.mp4 这是我的相机课。 我有一个预感,这是相关的相机位置的计算。 我尝试了各种不同的计算方法,他们似乎都遵循相同的模式和相同的行为。 另外m_camera_rotation代表Y旋转,因为投球还没有实现。 #include "camera.h" camera::camera(float x, float y, float z, float initial_rotation) { m_x = x; m_y = y; m_z = z; m_camera_rotation = initial_rotation; updateDXZ(); } camera::~camera(void) { } void camera::updateDXZ() { m_dx = sin(m_camera_rotation * (XM_PI/180.0)); m_dz = cos(m_camera_rotation * (XM_PI/180.0)); } void camera::Rotate(float amount) […]

我如何find片段着色器中4个顶点之间的位置?

我使用SharpDX(C#中的DirectX11)创建了一个着色器,该着色器从顶点着色器的输出中获取一个片段(2个点),然后将它们传递给一个几何着色器,该着色器将该线条转换为一个矩形(4个点)四角有纹理坐标。 之后,我想要一个片段着色器(它接收插入的位置和插值的纹理坐标),检查“矩形的脊柱”的深度(即,在通过矩形中间的线)。 问题是我不知道如何提取在矩形的脊柱相应片段的位置。 发生这种情况是因为我有纹理坐标插值,但我不知道如何使用它们来获得我想要的片段,因为a)纹理的坐标系和b)我的片段在屏幕空间中的位置不是相同。

用Gregory补丁逼近细分曲面进行硬件镶嵌

我正在尝试实施该方法( http://research.microsoft.com/en-us/um/people/cloop/sga09.pdf )。 不幸的是我对第三章中的公式不太清楚,我希望得到一些答案。 我不清楚以下几点,你知道吗? 当我计算T(u,v,w)(一个点)时,我得到了什么样的价值?我该如何处理结果呢? 我从域着色器SV_DomainLocation接收值u,v,w还是计算? 第3.2章重心也是角点吗? 图5中的v被v取代了吗? 在第3.3章边点中有一个e0 +的公式,但没有一个是e0-? 图5中哪个边是e0 +? 以及如何计算e0 +的其他边缘? 在我看来(图5)有5个边,但只有一个e0 +计算,不应该有5 e0 +? 你可能有一个关于控制网格的控制点图吗? 我有看到大局的问题 在第3.4章:面点中,提到了不同的横向向量r,r0 +和r0-,但r0 +只有一个公式。 是r = r0 + = r0-? 如果不是,我该如何计算r和r0-? 我希望有人能指出我正确的方向,提前谢谢你!

如何在DirectX11中创建和填充2D纹理数组

我已经生成了一堆ID3D11ShaderResourceView ,这是一个2D纹理,其深度图屏幕截图为我的灯光阴影。 我想把所有这些纹理,并把它们放入一个单一的2D纹理数组。 我已经看到了如何在这个问题中创建2D纹理数组的示例,但是我不知道如何将数据复制到新创建的纹理数组中。

镶嵌裂缝

我正在尝试使用由三角形大小和屏幕距离计算的镶嵌因子dx11进行网格镶嵌。 我在三角形的三条边上做了相同的操作,所以我希望我在另一个分享边的三角形上得到相同水平的tesselation,但似乎没有。 有没有人有一个想法,为什么这不像预期的那样工作? 我需要在边的另一边进行相同数量的曲面细分以进行位移映射,而不会出现任何裂缝。 在这个图像中有5个三角形,红色的“圆圈”是由四个三角形成对共享的两条边。 float calcLod(float3 a, float3 b) { float dist = distance(a,b) ; float3 center = (b+a)/2; float camDist = distance(CameraPosition, center); return dist * tesselationStrength / camDist; } hullShaderConstantOutput hullShaderConstant( InputPatch<vertexShaderOutput, 3> ip, uint pid : SV_PrimitiveID ) { hullShaderConstantOutput output; // get worldspace positions float3 v0 = ip[0].position; float3 v1 […]

管道中的DirectX11像素着色器缺失

我正在编写一个使用DirectX显示MS3D模型的程序,不幸的是,结果在屏幕上什么也没有显示。 当我从Visual Studio 13使用graphicsdebugging器时,我注意到像素着色器从管道中丢失,如下图所示 这是我的像素着色器源代码: cbuffer SkinningTransforms { matrix WorldMatrix; matrix ViewProjMatrix; }; //——————————————————————————– // Inter-stage structures //——————————————————————————– struct VS_INPUT { float3 position : POSITION; int4 bone : BONEID; float4 weights : BONEWEIGHT; float3 normal : NORMAL; float3 tangent : TANGENT; float2 tex : TEXCOORD; }; //——————————————————————————– struct VS_OUTPUT { float4 position : SV_Position; float3 […]

顶点不在2D空间中绘制

我很快就开始自学DirectX,遇到了一个我自己搞不清楚的问题。 我试图建立我自己的字体系统,所以我可以在2D屏幕上绘制string。 直到现在,我已经设法创建一个函数,我只需要传递string和屏幕空间位置,并且它会生成/设置缓冲区等的所有顶点(四边形,我绘制字体的某个部分纹理)。 当我在3D空间中绘制这些顶点时,一切看起来像它应该是。 (忘记隐藏立方体)只要我尝试切换到2D,我只是得到一个充满蓝色backgroundcolor的窗口。 切换到2D我做了以下事情: graphics.context->ClearDepthStencilView(graphics.depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); context->OMSetDepthStencilState(depthDisabledStencilState, 1); WVP = XMMatrixOrthographicLH((float)mWidth, (float)mHeight, 0.0f, 1.0f); cbPerVert.WVP = XMMatrixTranspose(WVP); cbPerVert.World = XMMatrixTranspose(World); context->UpdateSubresource( cbPerVertexBuffer, 0, NULL, &cbPerVert, 0, 0 ); context->VSSetConstantBuffers( 0, 1, &cbPerVertexBuffer ); 我的问题是现在我在这里做错了。 如果顶点正在生成和绘制正确,afaik我所要做的就是将它们投影到屏幕空间,并禁用深度缓冲区,这是我在这里做的。顺便说一句:我随机尝试用2D设置绘制立方体,并正确绘制..非常感谢帮助:)

使用SharpDX阅读纹理的一部分

我有一个Texture3D 。 我想从CPU端读取它的一部分。 (我正在使用SharpDX工具包(v2.5.1))。 我的数据总是0,但输出显示没有错误。 这是源纹理: testTex = Texture3D.New<float>(GraphicsDevice, wx, wy, wz, PixelFormat.R32.Float, texDat, TextureFlags.ShaderResource, sdx11.ResourceUsage.Default); 我正在尝试阅读这里的一部分: tempFloat = new float[1]; TextureDescription stagedTexDesc = new TextureDescription() { Height = 1, Width = 1, Depth = 1, MipLevels = 1, ArraySize = 1, Format = testTex.Format, Usage = sdx11.ResourceUsage.Staging, CpuAccessFlags = sdx11.CpuAccessFlags.Read | sdx11.CpuAccessFlags.Write, }; texNew […]

我应该什么时候使用实例化与常量缓冲区?

我听说过一些关于实例化的东西,并且明白这对于稍微改变多次绘制同一个对象是有用的。 这样做速度更快,因为每帧调用draw函数一次,并在每个帧更新一次缓冲区(在本例中为实例缓冲区),同时使用常量缓冲区,例如,如果需要世界matrix,则必须每隔一次更新常量缓冲区目的。 但是如果我只有一个对象,使用一个不变的缓冲区,实例化会更快(或者至less是一样快)吗? 通过实例化,您只需要调用一个更新缓冲区函数(对于顶点实例缓冲区),而使用CB则需要两个调用:一个用于顶点缓冲区,另一个用于常量缓冲区。 关于实例的另一个问题: 因为我必须每帧更新一次实例缓冲区,所以我需要用DYNAMIC_USAGE创建它,并且用一个字节宽度表示一次调用可以绘制的最大对象数量。 例如,如果我想传递一个matrix,我需要insBufferdesc.bwitdh= sizeof(matrixtype)*maxNumObjs 。 这是正确的吗? 鉴于maxNumObjs是20,我只想渲染10个objs,我应该只更新缓冲区的前10个matrix,并调用drawInstanced(…, 10) 。 如果我不使用所有的缓冲区,我会得到一些错误?

剔除vs绘制调用

在比桌面CPU / GPU(即移动设备)更高性能敏感的环境中,确定是否跳过绘制不可见对象与减less绘制调用次数的确切点有关? 我正在处理一个具有〜10,000个三角形的环境模型。 我可以将它分成30个左右的网格,这样在任何给定的点上都可以看到不到一半的网格。 然而,对于所有的10,000个三角形来说,15次绘制的调用是否比一次绘制的调用效率更高?