Directx 使用HLSL几何体着色器对二十面体进行多重细分
目前,我正在使用以下几何体着色器细分一次二十面体:Directx 使用HLSL几何体着色器对二十面体进行多重细分,directx,hlsl,directx-10,geometry-shader,Directx,Hlsl,Directx 10,Geometry Shader,目前,我正在使用以下几何体着色器细分一次二十面体: [maxvertexcount(8)] void gs(triangle VS_OUT gin[3], inout TriangleStream<GS_OUT> s) { // p1 // / \ // / \ // m0 --- m1 // / \ / \ // / \ / \ // p0 -
[maxvertexcount(8)]
void gs(triangle VS_OUT gin[3], inout TriangleStream<GS_OUT> s)
{
// p1
// / \
// / \
// m0 --- m1
// / \ / \
// / \ / \
// p0 -- m2 -- p2
float3 m0 = .5f * (gin[0].pos_l + gin[1].pos_l),
m1 = .5f * (gin[2].pos_l + gin[1].pos_l),
m2 = .5f * (gin[0].pos_l + gin[2].pos_l);
float3 v[6];
v[0] = gin[0].pos_l;
v[1] = m0;
v[2] = m2;
v[3] = m1;
v[4] = gin[2].pos_l;
v[5] = gin[1].pos_l;
GS_OUT gout;
for (int i = 0; i < 5; ++i)
{
gout.pos_h = mul(float4(v[i], 1.f), g_mat_wvp);
s.Append(gout);
}
s.RestartStrip();
gout.pos_h = mul(float4(v[1], 1.f), g_mat_wvp);
s.Append(gout);
gout.pos_h = mul(float4(v[5], 1.f), g_mat_wvp);
s.Append(gout);
gout.pos_h = mul(float4(v[3], 1.f), g_mat_wvp);
s.Append(gout);
}
[maxvertexcount(8)]
无效gs(三角形VS_OUT gin[3],输入-输出三角形流s)
{
//p1
// / \
// / \
//m0---m1
// / \ / \
// / \ / \
//p0--m2--p2
float3 m0=.5f*(gin[0]。pos_l+gin[1]。pos_l),
m1=.5f*(gin[2]。pos_l+gin[1]。pos_l),
m2=.5f*(gin[0]。位置1+gin[2]。位置1);
3v[6];
v[0]=gin[0]。位置;
v[1]=m0;
v[2]=m2;
v[3]=m1;
v[4]=gin[2]。位置;
v[5]=gin[1]。位置;
痛风;
对于(int i=0;i<5;++i)
{
痛风位置h=mul(浮动4(v[i],1.f),g_mat_wvp);
s、 痛风;
}
s、 RestartStrip();
痛风位置h=mul(浮动4(v[1],1.f),g_mat_wvp);
s、 痛风;
痛风位置h=mul(浮动4(v[5],1.f),g_mat_wvp);
s、 痛风;
痛风位置h=mul(浮动4(v[3],1.f),g_mat_wvp);
s、 痛风;
}
但是,我想指定细分级别。是否有可能使用输出的垂直方向再次调用着色器,或者我需要采用其他方法?我已通过以下方式解决了此问题:
[maxvertexcount(128)]
void gs(triangle VS_OUT gin[3], inout TriangleStream<GS_OUT> s)
{
if (g_subdivs != 0 && g_subdivs <= MAX_SUBDIVISION_LEVEL)
{
uint level_count = (uint)pow(2, g_subdivs);
float3 u = (gin[1].pos_l - gin[0].pos_l) / level_count,
w = (gin[2].pos_l - gin[0].pos_l) / level_count,
v = gin[0].pos_l;
for (int level = level_count; level > 0; --level)
{
GS_OUT gout;
gout.pos_h = mul(float4(normalize(v), 1.f), g_mat_wvp);
s.Append(gout);
float3 p = v;
uint vertex_count = level + 1;
for (uint vertex = 1; vertex < vertex_count; ++vertex)
{
gout.pos_h = mul(float4(normalize(p + u), 1.f), g_mat_wvp);
s.Append(gout);
gout.pos_h = mul(float4(normalize(p += w), 1.f), g_mat_wvp);
s.Append(gout);
}
v += u;
s.RestartStrip();
}
}
else
{
[unroll]
for (uint i = 0; i < 3; ++i)
{
GS_OUT gout;
gout.diff = gin[i].diff;
gout.pos_h = mul(float4(gin[i].pos_l, 1.f), g_mat_wvp);
s.Append(gout);
}
}
}
[maxvertexcount(128)]
无效gs(三角形VS_OUT gin[3],输入-输出三角形流s)
{
如果(g_subdivs!=0&&g_subdivs 0;--level)
{
痛风;
gout.pos_h=mul(浮动4(标准化(v),1.f),g_mat_wvp);
s、 痛风;
3 p=v;
uint顶点计数=级别+1;
对于(uint顶点=1;顶点<顶点计数;++顶点)
{
gout.pos_h=mul(float4(正常化(p+u),1.f),g_mat_wvp);
s、 痛风;
gout.pos_h=mul(float4(正常化(p+=w),1.f),g_mat_wvp);
s、 痛风;
}
v+=u;
s、 RestartStrip();
}
}
其他的
{
[展开]
对于(uint i=0;i<3;++i)
{
痛风;
痛风diff=gin[i].diff;
gout.pos_h=mul(float4(gin[i].pos_l,1.f),g_mat_wvp);
s、 痛风;
}
}
}