我是几何着色器的新手,所以我试图制作一个几何着色器,该几何着色器将以一个点并创建一个带有纹理坐标的四边形,作为一个示例,以了解几何着色器的工作原理。这是我编写的代码:
Texture2D txDiffuse : register( t0 );
SamplerState samAnisotropic
{
Filter = ANISOTROPIC;
MaxAnisotropy = 4;
};
cbuffer cbFixed
{
//
// Compute texture coordinates to stretch texture over quad.
//
float2 gTexC[4] =
{
float2(0.0f, 1.0f),
float2(0.0f, 0.0f),
float2(1.0f, 1.0f),
float2(1.0f, 0.0f)
};
};
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
}
struct VS_INPUT
{
float3 Pos : POSITION;
};
struct VertexOut
{
float3 Pos : POSITION;
};
struct GeoOut
{
float4 PosH : SV_POSITION;
float2 Tex : TEXCOORD;
uint PrimID : SV_PrimitiveID;
};
VertexOut VS( VS_INPUT input )
{
VertexOut output;
output.Pos = input.Pos;
return output;
}
[maxvertexcount(4)]
void GS(point VertexOut gin[1], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> tristream)
{
float4 v[4];
v[0] = float4(gin[0].Pos + float3(1.0f, -1.0f, 0.0f), 1.0f);
v[1] = float4(gin[0].Pos + float3(1.0f, 1.0f, 0.0f), 1.0f);
v[2] = float4(gin[0].Pos + float3(-1.0f, -1.0f, 0.0f), 1.0f);
v[3] = float4(gin[0].Pos + float3(-1.0f, 1.0f, 0.0f), 1.0f);
GeoOut gout;
[unroll]
for (int i = 0; i < 4; i++)
{
gout.PosH = mul(v[i], World);
gout.PosH = mul(v[i], View);
gout.PosH = mul(v[i], Projection);
gout.Tex = gTexC[i];
gout.PrimID = primID;
tristream.Append(gout);
}
}
float4 PS( GeoOut input) : SV_Target
{
//return txDiffuse.Sample( samAnisotropic, input.Tex );
return float4( 1.0f, 1.0f, 1.0f, 1.0f );
}
编译此代码时,出现空白屏幕。起初我以为可能是纹理问题,所以我尝试将像素着色器输出为白色,但这没有帮助。接下来,我认为由于三角形的缠绕方式可能无法显示,因此我禁用了背面剔除,但仍然没有帮助。我不确定接下来要尝试什么。关于这个问题有什么想法吗?
最佳答案
我从未使用过几何着色器,但是我认为您计算gout.PosH
的方式是错误的。它应该是
float4 p = mul(v[i], World);
p = mul(p, View);
p = mul(p, Projection);
gout.PosH = p;
看看你哪里出问题了吗?希望这可以帮助。
关于c++ - 使用几何着色器指向四边形扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24963209/