-1

我的问题希望非常简单,但我似乎无法正确处理数据流。问题是如何将纹理坐标和法线数据从顶点着色器通过曲面细分阶段(外壳和域着色器)传递到像素着色器进行渲染。

我遇到的问题是,在使用镶嵌之前,数据可以简单地从顶点传递到像素着色器。现在这两个着色器之间有多个步骤,一个补丁常量函数是外壳着色器,然后是域着色器。

如果有人能给我一些关于如何通过这些部分传递数据的见解,如果可能的话,也许可以用一些快速的伪代码来演示它,我将非常感激。如果您需要更多信息或我当前的代码(即使它不起作用),请告诉我。

额外信息:该程序是使用 C++ 编写的,使用 DirectX 11 api 使用 HLSL。

4

3 回答 3

0

This is the code that I used to create the tessellation, I hide the some code to show only the necessary for you. ps: tess_factor is a parameter of constant buffer.

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID)
{
HS_OUTPUT_DATA ret;
float tess = tess_factor;
ret.edges[0] = ret.edges[1] = ret.edges[2] = tess;
ret.inside = tess; // same value that edges
return ret;
}

[domain("tri")]
[partitioning("integer")] // integer, fractional_even, fractional_odd
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("hs_patch")]
HS_OUTPUT hs(InputPatch<VERTEX_PASS, 3> ip, uint index : SV_OutputControlPointID)
{
HS_OUTPUT ret;
ret.pos = ip[index].pos;
return ret;
}

[domain("tri")]
VERTEX_PASS ds(HS_OUTPUT_DATA input, float3 dl : SV_DomainLocation, const     
OutputPatch<HS_OUTPUT, 3> bp)
{
    VERTEX_PASS ret;
    ret.pos = bp[0].pos * dl.x + bp[1].pos * dl.y + bp[2].pos * dl.z;
    return ret;
}
于 2012-12-27T15:14:44.407 回答
0

Vertex、Hull、Domain和Pixel Shader的常量缓冲区是分开的。在应用程序后面的代码中,在您使用的常量缓冲区中设置参数:

ID3D11DeviceContext::PSSetConstantBuffers
ID3D11DeviceContext::HSGetConstantBuffers

第一个函数将常量缓冲区设置为像素着色器使用。船体着色器的第二组。但是在您的情况下,您必须使用结构向前传递参数。这是我只传递颜色的代码:

struct VERTEX_PASS
{
    float4 pos : SV_POSITION;
    float4 color : COLOR;
};

struct HS_OUTPUT_DATA
{
    float4 pos : WORLDPOS;
    float4 color : COLOR;
    float edges[3] : SV_TessFactor; // not using in this example
    float inside : SV_InsideTessFactor; // not using in this example
};

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID)
{
    HS_OUTPUT_DATA ret;
    ret.color = ip[pid].color; // pass the color to forward
    return ret;
}

纹理坐标是相同的想法,但是所有顶点的颜色都是恒定的,在纹理坐标的情况下,在域着色器阶段,您必须像计算最终顶点位置一样计算新的 UV 坐标。

于 2012-12-27T15:40:10.420 回答
0

我认为您需要一个简单的示例,因为您没有像错误消息等那样解释您的情况。

这是一个:http ://www.rastertek.com/dx11tut38.html

作者几乎对每一行代码都进行了简单的解释,可以看tessellation stage部分来了解如何定义渲染管线各stage之间的数据结构。

我还建议您在启用调试信息的情况下编译着色器代码。 http://msdn.microsoft.com/zh-tw/library/windows/desktop/ff476261(v=vs.85).aspx

这样你就可以知道你的着色器程序出了什么问题,也许你可以立即自己解决它。

我只想在下面发表评论,但不知何故评论按钮消失了。

于 2013-01-07T15:13:18.503 回答