[英]Point to quad expansion with Geometry Shader
我是几何着色器的新手,所以我试图制作一个几何着色器,该几何着色器将以一个点并使用纹理坐标创建一个四边形,以作为示例,以了解几何着色器的工作原理。 这是我编写的代码:
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;
看看你哪里出问题了吗? 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.