我尝试使用几何着色器扩展渲染器(对于TressFX),因此我采用了babysteps以便看到一切正常。因此,我创建了一个simpel pass-through Geometry Shader,它适用于三角形,但由于某种原因不适用于线条或点(将三角形转换为线条和点),因为我无法看到输出。 Result link
如果有人能指出为什么它不适用于线和点,我会很高兴。
码
ASetPrimitiveTopology设置为D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST
顶点着色器
struct PS_INPUT_HAIR_AA
{
float4 Position : SV_POSITION;
float4 Tangent : Tangent;
float4 p0p1 : TEXCOORD0;
};
PS_INPUT_HAIR_AA VS_RenderHair( uint vertexId : SV_VertexID )
{
PS_INPUT_HAIR_AA Output = (PS_INPUT_HAIR_AA)0;
Calculate position etc...
Output.Position = mul(float4(v, 1), g_mViewProj);
Output.Tangent = float4(t, ratio);
Output.p0p1 = float4( v.xy, g_HairVertexPositions[vertexId+1].xy );
return Output;
}
三角形的几何着色器(有效)
[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout TriangleStream<PS_INPUT_HAIR_AA> OutputStream )
{
PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;
for(uint i = 0; i < 3; ++i) {
output.Position = input[i].Position;
output.Tangent = input[i].Tangent;
output.p0p1 = input[i].p0p1;
OutputStream.Append( output );
}
OutputStream.RestartStrip();
}
点和线的几何着色器(不起作用)
[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )
{
PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;
for(uint i = 0; i < 3; ++i) {
output.Position = input[i].Position;
output.Tangent = input[i].Tangent;
output.p0p1 = input[i].p0p1;
OutputStream.Append( output );
OutputStream.RestartStrip(); // Not sure if I need this
}
}
[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout LineStream<PS_INPUT_HAIR_AA> OutputStream )
{
PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;
for(uint i = 0; i < 3; ++i) {
output.Position = input[i].Position;
output.Tangent = input[i].Tangent;
output.p0p1 = input[i].p0p1;
OutputStream.Append( output );
}
OutputStream.RestartStrip();
}
但是,如果我在Point / Line直通几何着色器中硬编码output.Position,我可以设法得到一个我可以在屏幕上看到的输出。
答案 0 :(得分:0)
我认为你不能改变几何着色器中的原始拓扑。要将网格渲染为线/点,您可能需要在渲染函数中设置它,如下所示。
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST);
or
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST);
另一件事是,如果要更改几何着色器中的基本类型,则应使用
void GS_RenderHairPassThrough( line PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )
or
void GS_RenderHairPassThrough( point PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )
我看到你使用triangle
作为GS_RenderHairPassThrough
的第一个参数