Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx Direct3D 11不光栅化任何顶点_Directx_Direct3d_Directx 11_Direct3d11 - Fatal编程技术网

Directx Direct3D 11不光栅化任何顶点

Directx Direct3D 11不光栅化任何顶点,directx,direct3d,directx-11,direct3d11,Directx,Direct3d,Directx 11,Direct3d11,我试图使用Direct3D 11在屏幕上渲染一个简单的三角形,但什么也没有显示。以下是我的顶点: SimpleVertex vertices[ 3 ] = { { XMFLOAT3( -1.0f, -1.0f, 0.0f ) }, { XMFLOAT3( 1.0f, -1.0f, 0.0f ) }, { XMFLOAT3( -1.0f, 1.0f, 0.0f ) }, }; 预期输出是一个三角形,一个点位于屏幕的左上角,一个点位于屏幕的右上角,一个点位于屏幕的左下角

我试图使用Direct3D 11在屏幕上渲染一个简单的三角形,但什么也没有显示。以下是我的顶点:

SimpleVertex vertices[ 3 ] =
{
    { XMFLOAT3( -1.0f, -1.0f, 0.0f ) },
    { XMFLOAT3(  1.0f, -1.0f, 0.0f ) },
    { XMFLOAT3( -1.0f,  1.0f, 0.0f ) },
};
预期输出是一个三角形,一个点位于屏幕的左上角,一个点位于屏幕的右上角,一个点位于屏幕的左下角。但是,任何地方都没有渲染任何内容

我没有执行任何矩阵变换,顶点着色器只是将输入直接传递到输出。一切似乎都设置正确,当我在Visual Studio 2012中使用图形调试器时,正确的顶点位置被传递到顶点着色器。但是,它直接从顶点着色器阶段跳到管道中的输出合并阶段。我假设这意味着没有向像素着色器发送任何内容,这也意味着矢量在光栅化器阶段被丢弃。为什么会这样

这是我的光栅化器状态:

D3D11_RASTERIZER_DESC rasterizerDesc;
rasterizerDesc.AntialiasedLineEnable = false;
rasterizerDesc.CullMode = D3D11_CULL_NONE;
rasterizerDesc.DepthBias = 0;
rasterizerDesc.DepthBiasClamp = 0.0f;
rasterizerDesc.DepthClipEnable = true;
rasterizerDesc.FillMode = D3D11_FILL_SOLID;
rasterizerDesc.FrontCounterClockwise = false;
rasterizerDesc.MultisampleEnable = false;
rasterizerDesc.ScissorEnable = false;
rasterizerDesc.SlopeScaledDepthBias = 0.0f;
“我的视口宽度/高度”是与我的后缓冲区匹配的窗口客户端区域,在我的测试设置中设置为1024x576:

D3D11_VIEWPORT viewport;
viewport.Height = static_cast< float >( height );
viewport.MaxDepth = 1.0f;
viewport.MinDepth = 0.0f;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = static_cast< float >( width );

有人能看到是什么让光栅化阶段删除我的顶点吗?或者我的D3D设置中还有其他部分可能导致这种情况吗?

我在互联网上发现了这种情况。。加载它花了很长时间,所以我复制并粘贴了我用粗体突出显示了一个有趣的点

在第11行中定义的D3DyLoad构造函数提供了C++程序员使用D3DLLVTEXTX创建转换和点亮顶点的方便方法。

_D3DTLVERTEX(const D3DVECTOR& v, float _rhw, D3DCOLOR _color,
         D3DCOLOR _specular, float _tu, float _tv)
{
sx = v.x;
sy = v.y;
sz = v.z;
rhw = _rhw;
color = _color;
specular = _specular;
tu = _tu;
tv = _tv;
}

系统需要已变换的顶点位置。所以x和y值必须在屏幕坐标中,z必须是像素的深度值,可以在z缓冲区中使用,我们这里不使用z缓冲区。Z值的范围从0.0到1.0,其中0.0是距离查看器最近的可能位置,1.0是查看区域内仍然可见的最远位置。紧跟在该位置之后,变换和照亮的顶点必须包含均匀W值的RHW倒数

在光栅化顶点之前,必须将它们从同质顶点转换为非同质顶点,因为光栅化器希望它们是这样。Direct3D通过将x、y和z坐标除以w坐标将均质顶点转换为非均质顶点,并通过反转w坐标生成RHW值。这仅适用于通过Direct3D变换和照明的顶点。 RHW值以多种方式使用:用于计算雾,用于执行透视正确的纹理贴图,以及用于w缓冲深度缓冲的另一种形式

定义了D3D_重载后,D3DVECTOR被声明为

_D3DVECTOR(D3DVALUE _x, D3DVALUE _y, D3DVALUE _z);
D3DVALUE是基本的Direct3D分数数据类型。它在d3dtypes.h中声明为

 typedef float D3DVALUE, *LPD3DVALUE;
源代码显示D3DVECTOR的x和y值始终为0.0,这将在InitDeviceObject中更改。rhw始终为0.5f,颜色为0xfffffff,镜面反射设置为0。四个顶点之间只有tu1和tv1值不同。这些是背景纹理的坐标

为了将texel映射到基本体上,Direct3D要求所有纹理中的所有texel具有统一的地址范围。因此,它使用一种通用寻址方案,其中所有texel地址都在0.0到1.0(包括0.0到1.0)的范围内。 如果您决定指定纹理坐标以使Direct3D使用纹理的下半部分,则在本例中,应用程序将指定给基本体顶点的纹理坐标为0.0,0.0,1.0,0.0,1.0,0.5和0.0,0.5。Direct3D将应用纹理的下半部分作为背景

注意:通过指定超出该范围的纹理坐标,可以创建某些特殊的纹理效果

您将在D3DTextr.cpp的框架源代码中找到D3DTextr_CreateTextureFromFile的声明。它从传递的文件创建本地位图。纹理可以从*.bmp和*.tga文件创建。纹理在框架中以链表的形式进行管理,链表保存每个纹理的信息,称为纹理容器

 struct TextureContainer
{
TextureContainer* m_pNext; // Linked list ptr

TCHAR   m_strName[80];  // Name of texture (doubles as image filename)
DWORD   m_dwWidth;
DWORD   m_dwHeight;
DWORD   m_dwStage;      // Texture stage (for multitexture devices)
DWORD   m_dwBPP;
DWORD   m_dwFlags;
BOOL    m_bHasAlpha;

LPDIRECTDRAWSURFACE7 m_pddsSurface;  // Surface of the texture
HBITMAP m_hbmBitmap;                 // Bitmap containing texture image
DWORD*  m_pRGBAData;

public:
HRESULT LoadImageData();
HRESULT LoadBitmapFile( TCHAR* strPathname );
HRESULT LoadTargaFile( TCHAR* strPathname );
HRESULT Restore( LPDIRECT3DDEVICE7 pd3dDevice );
HRESULT CopyBitmapToSurface();
HRESULT CopyRGBADataToSurface();

TextureContainer( TCHAR* strName, DWORD dwStage, DWORD dwFlags );
~TextureContainer();
};

问题实际上在我的渲染逻辑中。我将顶点缓冲区的步长设置为0,而不是顶点结构的大小。改变了这一点,它渲染得很好

当然,我很感激花时间,但这似乎与我遇到的问题无关。这似乎也是针对DirectX 7的,它与Direct3D 11 API几乎没有相似之处。