Directx 几何体着色器接收原点上的额外点

Directx 几何体着色器接收原点上的额外点,directx,hlsl,slimdx,geometry-shader,Directx,Hlsl,Slimdx,Geometry Shader,我在使用几何体着色器时遇到了一个非常奇怪的问题。我制作了一个非常简单的几何体着色器,它取一个点并将其转换为三角形 以下是着色器: struct GS_OUTPUT { float4 pos : SV_POSITION; }; struct VS_INPUT { float3 pos : ANCHOR; }; VS_INPUT VShader(VS_INPUT input) { return input; } float4 PShader(float4 posi

我在使用几何体着色器时遇到了一个非常奇怪的问题。我制作了一个非常简单的几何体着色器,它取一个点并将其转换为三角形

以下是着色器:

struct GS_OUTPUT
{
    float4 pos : SV_POSITION;
};

struct VS_INPUT
{
    float3 pos : ANCHOR;
};

VS_INPUT VShader(VS_INPUT input)
{
    return input;   
}

float4 PShader(float4 position: SV_POSITION) : SV_Target
{
return float4(0.0, 1.0, 0.5, 0.0);
}

[maxvertexcount(3)]
void Triangulat0r( point VS_INPUT input[1], inout TriangleStream<GS_OUTPUT> OutputStream )
{   
    GS_OUTPUT output;
float3 _input;

_input = input[0].pos;

output.pos = float4(_input.x + 0.1, _input.y - 0.1, _input.z, 1.0);
OutputStream.Append( output );


output.pos = float4(_input.x - 0.1, _input.y - 0.1, _input.z, 1.0);
OutputStream.Append( output );


output.pos = float4(_input.x, _input.y + 0.1, _input.z, 1.0);
OutputStream.Append( output );

}
我得到这个输出:

如您所见,我只向输入汇编程序发送了4个三角形,输出中有5个三角形

你知道为什么会这样吗?恐怕这可能与缓冲区分配的额外内存有关。。。但我似乎不知道问题到底出在哪里


提前谢谢

如果尝试绘制比顶点缓冲区中的顶点更多的顶点,则所有“额外”顶点的值都将为零。如果通过Windbg运行程序(不会在Visual studio中显示),您将看到以下警告

D3D10:警告:ID3D10Device::Draw:输入顶点处的顶点缓冲区 插槽0不够大,无法满足Draw*()调用的期望 穿过这是正常的,因为定义了读取缓冲区的末尾 返回0。然而,开发商可能并不打算使用 这种行为的后果。[执行警告#356: 设备\绘制\顶点\缓冲区\太小】


绘制调用使用的顶点数是否超过4?如果是这样的话,任何超过(绘制计数-缓冲区大小)的顶点的值都是零,而你的额外三角形的中心是0。没错!我放了12个顶点,因为这是实际绘制的,但我想这不是很聪明,因为只有4个顶点被实际发送到GPU。非常感谢你!你想把它作为一个答案,这样我就可以接受吗?不客气。常量缓冲区也会出现同样的问题(额外值将为0),因此请注意
// create test vertex data, making sure to rewind the stream afterward
var vertices = new DataStream(12*4, true, true);
vertices.Write(new Vector3(-0.5f, -0.5f, 0f));
vertices.Write(new Vector3(-0.5f, 0.5f, 0f));
vertices.Write(new Vector3(0.5f, 0.5f, 0f));
vertices.Write(new Vector3(0.5f, -0.5f, 0f));
vertices.Position = 0;

// create the vertex layout and buffer
var elements = new[] { new InputElement("ANCHOR", 0, Format.R32G32B32_Float, 0) };
var layout = new InputLayout(device, inputSignature, elements);
var vertexBuffer = new Buffer(device, vertices, 12 * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

// configure the Input Assembler portion of the pipeline with the vertex data
context.InputAssembler.InputLayout = layout;
context.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 12, 0));