2012-03-20 61 views
1

使用幾何着色器時我有一個很奇怪的問題。我製作了一個非常簡單的幾何着色器,它需要一個點並將其轉換爲三角形。幾何着色器在原點上接收到額外的點

這裏是着色器:

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個頂點是這樣的:

// 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)); 

而且我得到這樣的輸出:

output from the program, with the strange middle triangle

正如你所看到的,我只向輸入彙編器發送了4個三角形,並且5個出現在輸入彙編器中tput ..

關於爲什麼發生這種情況的任何想法?恐怕這可能與緩衝區分配的額外內存有關......但我似乎無法弄清楚問題出在哪裏。

在此先感謝!

+1

您的繪圖調用是否使用超過4個頂點數?如果是這樣,過去的任何頂點(繪製計數 - 緩衝區大小)的值爲零,並且您的多餘三角形以0爲中心。 – 2012-03-20 16:53:56

+0

沒錯!我已經放置了12個頂點,因爲這是實際繪製的,但我想這不是很聰明,因爲實際上只有4個頂點被髮送到GPU。非常感謝你!你想把它作爲答案,所以我可以接受它嗎? – 2012-03-20 17:00:14

+1

不客氣。常量緩衝區也會出現同樣的問題(額外的值爲0),因此請注意 – 2012-03-20 17:04:30

回答

3

如果您嘗試繪製比頂點緩衝區中的頂點更多的頂點,則所有「額外」頂點的值都將爲零。如果您通過Windbg運行程序(不會在Visual Studio中顯示),您會看到以下警告。

D3D10:警告:ID3D10Device ::消耗:頂點緩衝區的輸入頂點 插槽0不是什麼抽獎*()調用預計 遍歷足夠大。這是可以的,因爲讀取緩衝區的末尾被定義爲 返回0.但是開發者可能不打算使用 這種行爲。 [執行警告#356: DEVICE_DRAW_VERTEX_BUFFER_TOO_SMALL]