C++ 使用几何体着色器指向四边形展开
我是几何体着色器的新手,所以我正在尝试制作一个几何体着色器,它将获取一个点并创建一个具有纹理坐标的四边形,作为一个示例来查看几何体着色器的工作原理。以下是我编写的代码:C++ 使用几何体着色器指向四边形展开,c++,directx-11,C++,Directx 11,我是几何体着色器的新手,所以我正在尝试制作一个几何体着色器,它将获取一个点并创建一个具有纹理坐标的四边形,作为一个示例来查看几何体着色器的工作原理。以下是我编写的代码: Texture2D txDiffuse : register( t0 ); SamplerState samAnisotropic { Filter = ANISOTROPIC; MaxAnisotropy = 4; }; cbuffer cbFixed { // // Compute text
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 );
}
Texture2D txDiffuse:寄存器(t0);
非均质性
{
滤波器=各向异性;
最大各向异性=4;
};
cbuffer cbFixed
{
//
//计算纹理坐标以在四边形上拉伸纹理。
//
浮动2 gTexC[4]=
{
浮动2(0.0f,1.0f),
浮动2(0.0f,0.0f),
浮动2(1.0f,1.0f),
浮动2(1.0f,0.0f)
};
};
cbuffer ConstantBuffer:寄存器(b0)
{
矩阵世界;
矩阵视图;
矩阵投影;
}
结构与输入
{
浮动3位:位置;
};
结构顶点输出
{
浮动3位:位置;
};
结构GeoOut
{
浮动4豪华:SV_位置;
浮动2 Tex:TEXCOORD;
uint-primitid:SV_-primitid;
};
顶点输出VS(VS_输入)
{
垂直输出;
output.Pos=input.Pos;
返回输出;
}
[maxvertexcount(4)]
void GS(点顶点输出gin[1],uint基元ID:SV_基元ID,输入非三角形流三流)
{
4 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]。位置+float3(-1.0f,-1.0f,0.0f),1.0f);
v[3]=float4(gin[0]。Pos+float3(-1.0f,1.0f,0.0f),1.0f);
痛风;
[展开]
对于(int i=0;i<4;i++)
{
gout.PosH=mul(v[i],世界);
gout.PosH=mul(v[i],视图);
痛风PosH=mul(v[i],投影);
痛风Tex=gTexC[i];
gout.PrimID=PrimID;
痛风;
}
}
浮动4 PS(GeoOut输入):SV_目标
{
//返回txDiffuse.Sample(samAnisotropic,input.Tex);
返回浮动4(1.0f、1.0f、1.0f、1.0f);
}
当我编译这段代码时,我得到一个空白屏幕。起初我认为这可能是一个纹理问题,所以我尝试将像素着色器输出为白色,但没有帮助。下一步,我认为它可能不会显示,因为三角形的方式是伤口,所以我禁用背面剔除,但它仍然没有帮助。我不知道下一步该试什么。关于这个问题有什么想法吗?我从未使用过几何体着色器,但我认为你计算痛风的方式是错误的。应该是
float4 p = mul(v[i], World);
p = mul(p, View);
p = mul(p, Projection);
gout.PosH = p;
看你哪里出错了?希望这能有所帮助。我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是
float4 p = mul(v[i], World);
p = mul(p, View);
p = mul(p, Projection);
gout.PosH = p;
看你哪里出错了?希望这能有所帮助。我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是
float4 p = mul(v[i], World);
p = mul(p, View);
p = mul(p, Projection);
gout.PosH = p;
看你哪里出错了?希望这能有所帮助。我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是
float4 p = mul(v[i], World);
p = mul(p, View);
p = mul(p, Projection);
gout.PosH = p;
看你哪里出错了?希望这能有所帮助。哇,修好了,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并对其进行了一点编辑,所以我假设它是正确的。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。