Performance CPU面翻转与GPU面翻转?
假设使用以下着色器代码,在CPU上生成三角形的另一侧会更有效:让GPU通过实例/世界矩阵平移双倍数量的顶点,还是在GPU上生成:以不同的顺序复制顶点并翻转法线 有趣的着色器代码片段:Performance CPU面翻转与GPU面翻转?,performance,directx,gpu,cpu,hlsl,Performance,Directx,Gpu,Cpu,Hlsl,假设使用以下着色器代码,在CPU上生成三角形的另一侧会更有效:让GPU通过实例/世界矩阵平移双倍数量的顶点,还是在GPU上生成:以不同的顺序复制顶点并翻转法线 有趣的着色器代码片段: struct VS_IN { float4 pos : POSITION; float3 norm : NORMAL; matrix instance : INSTANCEMATRIX; float4 color : INSTANCECOLOR; }; struct PS_IN {
struct VS_IN
{
float4 pos : POSITION;
float3 norm : NORMAL;
matrix instance : INSTANCEMATRIX;
float4 color : INSTANCECOLOR;
};
struct PS_IN
{
float4 pos : SV_POSITION;
float3 norm : NORMAL;
float4 color: COLOR;
};
cbuffer viewProj : register (b0)
{
matrix viewProj;
}
PS_IN VS(VS_IN input)
{
PS_IN output = (PS_IN)0;
output.pos = mul(mul(input.pos, input.instance), viewProj);
output.norm = normalize(mul(input.norm, (float3x3)input.instance));
output.color = input.color;
return output;
};
[maxvertexcount(6)]
void FlipFaceGS(triangle PS_IN input[3], inout TriangleStream<PS_IN> OutputStream)
{
OutputStream.Append(input[0]);
OutputStream.Append(input[1]);
OutputStream.Append(input[2]);
OutputStream.RestartStrip();
input[0].norm = -input[0].norm;
input[1].norm = -input[1].norm;
input[2].norm = -input[2].norm;
OutputStream.Append(input[0]);
OutputStream.Append(input[2]);
OutputStream.Append(input[1]);
OutputStream.RestartStrip();
}
technique10 Render
{
pass P0
{
SetVertexShader(CompileShader(vs_4_0, VS()));
SetGeometryShader(CompileShader(gs_4_0, FlipFaceGS()));
SetPixelShader(CompileShader(ps_4_0, PS()));
}
}
我认为关键词是剔除,因为你的方法似乎是针对绕过它
与其将几何体加倍(剔除后会移除不可见的一半),您只需关闭剔除设置D3D11_CULL_NONE,并在需要时使用pixelshader输入语义SV_IsFrontFace来翻转pixelshader中的法线。这可能会解决我的所有问题,谢谢!