“效果框架”;“带”的结构;将HLSL和C++; 我如何将这种技术(从Nvidia StestEntEthelelDestin样)转换为普通HLSL+DirectX 11 C++代码?< /P> float4 PreprocessedLoDVS( uint id : SV_InstanceID, uniform int method) : LODS { float4 tessLevel; if (method == 1) //Gregory { float3 positionControlPoints[20]; // 8 9 10 11 // 12 0\1 2/3 13 // 14 4/5 6\7 15 // 16 17 18 19 LoadGregoryPositionControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[16], positionControlPoints[14], positionControlPoints[12], positionControlPoints[8]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[19], positionControlPoints[15], positionControlPoints[13], positionControlPoints[11]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[16], positionControlPoints[17], positionControlPoints[18], positionControlPoints[19]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[8], positionControlPoints[9], positionControlPoints[10], positionControlPoints[11]); } else if (method == 0) { //Regular float3 positionControlPoints[16]; // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 LoadRegularControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 4], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 3], positionControlPoints[ 7], positionControlPoints[11], positionControlPoints[15]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 3]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[12], positionControlPoints[13], positionControlPoints[14], positionControlPoints[15]); } else if (method == 2) { //Bezier float3 positionControlPoints[16]; // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 LoadBezierPositionControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 4], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 3], positionControlPoints[ 7], positionControlPoints[11], positionControlPoints[15]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[12], positionControlPoints[13], positionControlPoints[14], positionControlPoints[15]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 3]); } else if (method == 3) { //Pm // 18 14 13 12 // 19 8 // 20 7 // 0 1 2 6 float3 positionControlPoints[24]; LoadPmControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[20], positionControlPoints[19], positionControlPoints[18]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 6], positionControlPoints[ 7], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[18], positionControlPoints[14], positionControlPoints[13], positionControlPoints[12]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 6]); } else { tessLevel=float4(2,2,2,2); } return tessLevel; } technique10 LoDRegularTechnique { pass P0 { SetDepthStencilState( DisableDepthWrites, 0 ); SetVertexShader( CompileShader( vs_4_0, PreprocessedLoDVS(0) ) ); SetGeometryShader( ConstructGSWithSO( CompileShader( vs_4_0, PreprocessedLoDVS(0) ), "LODS.xyzw" ) ); SetPixelShader( NULL ); } }

“效果框架”;“带”的结构;将HLSL和C++; 我如何将这种技术(从Nvidia StestEntEthelelDestin样)转换为普通HLSL+DirectX 11 C++代码?< /P> float4 PreprocessedLoDVS( uint id : SV_InstanceID, uniform int method) : LODS { float4 tessLevel; if (method == 1) //Gregory { float3 positionControlPoints[20]; // 8 9 10 11 // 12 0\1 2/3 13 // 14 4/5 6\7 15 // 16 17 18 19 LoadGregoryPositionControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[16], positionControlPoints[14], positionControlPoints[12], positionControlPoints[8]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[19], positionControlPoints[15], positionControlPoints[13], positionControlPoints[11]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[16], positionControlPoints[17], positionControlPoints[18], positionControlPoints[19]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[8], positionControlPoints[9], positionControlPoints[10], positionControlPoints[11]); } else if (method == 0) { //Regular float3 positionControlPoints[16]; // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 LoadRegularControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 4], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 3], positionControlPoints[ 7], positionControlPoints[11], positionControlPoints[15]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 3]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[12], positionControlPoints[13], positionControlPoints[14], positionControlPoints[15]); } else if (method == 2) { //Bezier float3 positionControlPoints[16]; // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 LoadBezierPositionControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 4], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 3], positionControlPoints[ 7], positionControlPoints[11], positionControlPoints[15]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[12], positionControlPoints[13], positionControlPoints[14], positionControlPoints[15]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 3]); } else if (method == 3) { //Pm // 18 14 13 12 // 19 8 // 20 7 // 0 1 2 6 float3 positionControlPoints[24]; LoadPmControlPoints(id, positionControlPoints); tessLevel.x = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[20], positionControlPoints[19], positionControlPoints[18]); tessLevel.y = evaluateEdgeLoD(positionControlPoints[ 6], positionControlPoints[ 7], positionControlPoints[ 8], positionControlPoints[12]); tessLevel.z = evaluateEdgeLoD(positionControlPoints[18], positionControlPoints[14], positionControlPoints[13], positionControlPoints[12]); tessLevel.w = evaluateEdgeLoD(positionControlPoints[ 0], positionControlPoints[ 1], positionControlPoints[ 2], positionControlPoints[ 6]); } else { tessLevel=float4(2,2,2,2); } return tessLevel; } technique10 LoDRegularTechnique { pass P0 { SetDepthStencilState( DisableDepthWrites, 0 ); SetVertexShader( CompileShader( vs_4_0, PreprocessedLoDVS(0) ) ); SetGeometryShader( ConstructGSWithSO( CompileShader( vs_4_0, PreprocessedLoDVS(0) ), "LODS.xyzw" ) ); SetPixelShader( NULL ); } },directx,hlsl,Directx,Hlsl,预处理的LODVs看起来像普通的顶点着色器,除了“LODS”签名,几何体着色器呢?这很好地解释了它,但基本上是总结 使用预处理的LODVS和vs_4_0作为配置文件,将着色器编译为blob 创建一个流输出布局,它是一个由4个组件组成的LODS语义数组 使用创建顶点着色器 使用D3D11_BIND_STREAM_OUTPUT标志创建缓冲区(与创建任何其他缓冲区相同,从该示例中,您还需要着色器资源标志,因为您需要SRV作为缓冲区输入进行绑定) 将此缓冲区绑定到流输出(使用) 将顶点着色器设置为管道并

预处理的LODVs
看起来像普通的顶点着色器,除了“LODS”签名,几何体着色器呢?

这很好地解释了它,但基本上是总结

使用预处理的LODVS和vs_4_0作为配置文件,将着色器编译为blob

创建一个流输出布局,它是一个由4个组件组成的LODS语义数组

使用创建顶点着色器

使用D3D11_BIND_STREAM_OUTPUT标志创建缓冲区(与创建任何其他缓冲区相同,从该示例中,您还需要着色器资源标志,因为您需要SRV作为缓冲区输入进行绑定)

将此缓冲区绑定到流输出(使用)

将顶点着色器设置为管道并执行绘制调用