Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectX大平面细分_C++_Directx_Shader_Tessellation - Fatal编程技术网

C++ DirectX大平面细分

C++ DirectX大平面细分,c++,directx,shader,tessellation,C++,Directx,Shader,Tessellation,只是一个关于DirectX11细分的问题 在外壳着色器中,可以设置的最大细分因子为64(不确定原因)。现在,虽然这对于小平面来说已经足够了,但对于大平面来说,这还不够,所以我想知道如何渲染大平面 以下代码生成我的四边形,其中R是半径: vertices[0] = D3DXVECTOR3(-R, 0.0f, R); //Top left vertices[1] = D3DXVECTOR3( R, 0.0f, R); //Top right vertices[2] = D3DXVECTOR3(

只是一个关于DirectX11细分的问题

在外壳着色器中,可以设置的最大细分因子为64(不确定原因)。现在,虽然这对于小平面来说已经足够了,但对于大平面来说,这还不够,所以我想知道如何渲染大平面

以下代码生成我的四边形,其中
R
是半径:

vertices[0] = D3DXVECTOR3(-R, 0.0f,  R); //Top left
vertices[1] = D3DXVECTOR3( R, 0.0f,  R); //Top right
vertices[2] = D3DXVECTOR3( R, 0.0f, -R); //Bottom right
vertices[3] = D3DXVECTOR3(-R, 0.0f, -R); //Bottom left
vertices[4] = D3DXVECTOR3(-R, 0.0f,  R); //Top left
vertices[5] = D3DXVECTOR3( R, 0.0f, -R); //Bottom right

indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 3;
indices[4] = 4;
indices[5] = 5;
我确实修改了它,把它放在一个循环中生成多个四边形,比如说在一个3x3的网格中。但是,当我将其传递给细分着色器时,第一个四边形可以正常工作,但其他四边形会出错

vector<D3DXVECTOR3> verts;
vector<D3DXVECTOR2> tex;

float R = 1000;

for(int z = 0; z < 4; z++)
{
    for(int x = 0; x < 4; x++)
    {
        float xOffset = x * (2*R);
        float zOffset = z * (2*R);

        // Load the vertex array with data.
        verts.push_back( D3DXVECTOR3(-R+ xOffset, 0.0f,  R+ zOffset) ); //Top left
        verts.push_back( D3DXVECTOR3( R+ xOffset, 0.0f,  R+ zOffset) ); //Top right
        verts.push_back( D3DXVECTOR3( R+ xOffset, 0.0f, -R+ zOffset) ); //Bottom right
        verts.push_back( D3DXVECTOR3(-R+ xOffset, 0.0f, -R+ zOffset) ); //Bottom left
        verts.push_back( D3DXVECTOR3(-R+ xOffset, 0.0f,  R+ zOffset) ); //Top left
        verts.push_back( D3DXVECTOR3( R+ xOffset, 0.0f, -R+ zOffset) ); //Bottom right

        tex.push_back( D3DXVECTOR2(0.0f, 0.0f) );
        tex.push_back( D3DXVECTOR2(1.0f, 0.0f) );
        tex.push_back( D3DXVECTOR2(0.0f, 1.0f) );
        tex.push_back( D3DXVECTOR2(0.0f, 1.0f) );
        tex.push_back( D3DXVECTOR2(1.0f, 0.0f) );
        tex.push_back( D3DXVECTOR2(1.0f, 1.0f) );
    }
}

// Set the number of vertices in the vertex array.
m_vertexCount = verts.size();

// Set the number of indices in the index array.
m_indexCount = verts.size();

// Create the vertex array.
vertices = new VertexType[m_vertexCount];
if(!vertices)
{
    return false;
}

// Create the index array.
indices = new unsigned long[m_indexCount];
if(!indices)
{
    return false;
}

for(int i = 0; i < m_vertexCount; i++)
{
    vertices[i].position = verts[i];
    vertices[i].texture =  tex[i];
    indices[i] = i;
}
向量顶点;
矢量tex;
浮点数R=1000;
对于(intz=0;z<4;z++)
{
对于(int x=0;x<4;x++)
{
浮点数xOffset=x*(2*R);
float zOffset=z*(2*R);
//用数据加载顶点数组。
垂直。向后推(D3DXVECTOR3(-R+xOffset,0.0f,R+zOffset));//左上角
顶点向后推(D3DXVECTOR3(R+xOffset,0.0f,R+zOffset));//右上角
垂直。向后推(D3DXVECTOR3(R+xOffset,0.0f,-R+zOffset));//右下角
垂直。向后推(D3DXVECTOR3(-R+xOffset,0.0f,-R+zOffset));//左下角
垂直。向后推(D3DXVECTOR3(-R+xOffset,0.0f,R+zOffset));//左上角
垂直。向后推(D3DXVECTOR3(R+xOffset,0.0f,-R+zOffset));//右下角
tex.push_back(D3DXVECTOR2(0.0f,0.0f));
tex.push_back(D3DXVECTOR2(1.0f,0.0f));
tex.push_back(D3DXVECTOR2(0.0f,1.0f));
tex.push_back(D3DXVECTOR2(0.0f,1.0f));
tex.push_back(D3DXVECTOR2(1.0f,0.0f));
tex.push_back(D3DXVECTOR2(1.0f,1.0f));
}
}
//设置顶点数组中的顶点数。
m_vertexCount=垂直尺寸();
//设置索引数组中的索引数。
m_indexCount=垂直尺寸();
//创建顶点数组。
顶点=新的顶点类型[m_vertexCount];
如果(!顶点)
{
返回false;
}
//创建索引数组。
索引=新的无符号长[m_indexCount];
如果(!索引)
{
返回false;
}
对于(int i=0;i
这是渲染循环平面时的外观:

为什么使用多个四边形时不能正确细分? 我应该通过在图形类中创建一个循环来解决这个问题,然后在这个循环中反复转换和渲染同一个四边形以创建网格吗


希望这是有意义的。

你是否真的想要对整个平面进行细分,这是非常值得怀疑的——你只是在浪费时间对整个平面进行细分,而观众甚至无法分辨远处点的差异。考虑实现某种程度的实时细节(LOD)算法。LOD的概念是为较近的对象提供更多细节,同时使较远的对象更简单以节省渲染时间。如果您没有“获取”LOD,下面是一幅您可以帮助您解决的图像:

高细分低细分

虽然这些特定的模型是在建模软件(如Maya)中手动创建的,而不是在GPU上实时细分,但您仍有希望了解这一点。当摄影机远离模型时,在右侧渲染兔子,当兔子离模型越来越近时,渲染更详细的兔子,直到摄影机正好靠近对象,此时您将以完全美丽的方式渲染它

在我的时间里,我发现了两种实时LOD方法,我认为它优于所有其他方法。第一个是为水渲染而开发的,它的链接是-我真的无法比他们解释得更好。当我现在试图解释另一个问题时,惊奇地看着(或者如果我失败了就指着并大笑)


GPU地形细分和细分
  • 资料来源:沃尔夫冈·恩格尔(Wolfgang Engel)的第一篇作品
  • 如果你斜视一点,你发布的图片可能会像严重倾斜的地形。因为这是为地形开发的,所以这可能比为水渲染而设计的其他方法更容易实现
任何一个见多识广的GPU程序员都知道,CPU速度快,GPU速度快。复杂图形的主要瓶颈是CPU和GPU之间的数据传输。这需要永远

该方法是专门为地形渲染开发的,是一种几乎完全基于GPU的算法,用于创建具有基于距离的LOD的细分网格。虽然性能在很大程度上取决于所安装硬件的支持能力,但此方法在速度方面进行了高度优化

基本上,该方法会反复细分,直到达到所需的LOD——由程序员传递的一些参数表示。此外,在算法的每次迭代中也会执行剔除,从而避免了大量不必要的处理或对外部区域的细分

由于此方法使用的所有数据都保留在GPU上并在GPU上进行优化,因此CPU主要用于执行其他任务。此外,我们还利用平滑LOD转换方案来展示细分算法的实际应用。最终输出(此图像带有部分叠加的线框)非常酷:

现在,我不想撒谎。这个算法很难接受。所以,我会尽我所能为你把它剥掉。这是行话:

可视区域
由变量R表示的可视区域定义为轴对齐(通常朝上)的四边形,表示要细分和/或渲染的区域。该区域由中心位置和宽度定义,沿每个轴在正方向和负方向延伸(见下图)。中心位置由RC表示。应用的偏移量用Rλ表示。区域的边界点由P1、P2、P3和P4表示。绘制一个可视区域跨度,如下所示:

可视区域span
A视图A