opengl GLSL Tessandem Shader为每个面片绘制不同方向的三角形

3ks5zfa0  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(202)

我正在OpenGL上使用TesskingShaders和补丁构建一个简单的地形,但是我对OpenGL如何绘制这些补丁感到困惑。OpenGL生成的三角形在每个补丁的不同方向上绘制,如图所示。
Difference between triangles of neighbour patches
Overview of different patches
我想知道是否有一个简单的方法来解决这个问题,比如使用OpenGL内置参数,或者有必要手动重新定位三角形。
我用的是OpenGL 4.0。我总共创建了8个补丁,我的tessLevel设置为64。
现在,我的代码是这样的:

纹理控制着色器

#version 400

layout (vertices = 4) out;

uniform int tessLevel;
#define ID gl_InvocationID

void Preset();

void main()
{
    gl_out[ID].gl_Position = gl_in[ID].gl_Position;

    if (ID == 0)
    {
        Preset();
    }
}

void Preset()
{
    gl_TessLevelOuter[0] = tessLevel;
    gl_TessLevelOuter[1] = tessLevel;
    gl_TessLevelOuter[2] = tessLevel;
    gl_TessLevelOuter[3] = tessLevel;

    gl_TessLevelInner[0] = tessLevel;
    gl_TessLevelInner[1] = tessLevel;
}

字符串

纹理评估着色器

#version 400

layout(quads, equal_spacing, cw) in;

uniform vec3 lightPos;
out vec3 tesLightDirection;

vec4 CalculateInterpolatedPosition(float u, float v);

void main()
{
    float u = gl_TessCoord.x;
    float v = gl_TessCoord.y;

    vec4 interpolatedPosition = CalculateInterpolatedPosition(u, v);
    tesLightDirection = normalize(lightPos - interpolatedPosition.xyz);

    gl_Position = interpolatedPosition;
}

vec4 CalculateInterpolatedPosition(float u, float v)
{
    vec4 p0 = gl_in[0].gl_Position;
    vec4 p1 = gl_in[1].gl_Position;
    vec4 p2 = gl_in[2].gl_Position;
    vec4 p3 = gl_in[3].gl_Position;

    return  p0 * (1 - u) * (1 - v) +
            p1 * u * (1 - v) +
            p3 * v * (1 - u) +
            p2 * u * v;
}


在我的C++程序中,我的补丁是以以下方式构建的:

void Terrain::GenerateVertices()
{
    for (int i = 0; i < totalPatches + 1; i++)
    {
        for (int j = 0; j < totalPatches + 1; j++)
        {
            vertices.push_back(vec3(j, 0, i));
        }
    }

    for (int i = 0; i < totalPatches; i++)
    {
        for (int j = 0; j < totalPatches; j++)
        {
            int startingPoint = i * (totalPatches + 1) + j;

            indices.push_back(startingPoint);
            indices.push_back(startingPoint + 1);
            indices.push_back(startingPoint + totalPatches + 2);
            indices.push_back(startingPoint + totalPatches + 1);
        }
    }
}

void Terrain::Render(mat4 projection, mat4 view)
{
    shader.use();
    mat4 VPMatrix = projection * view;

    shader.setUniform("VP", VPMatrix);
    shader.setUniform("M", transform.modelMatrix());

    glBindVertexArray(vaoID);
    glPatchParameteri(GL_PATCH_VERTICES, 4);
    glDrawElements(GL_PATCHES, indices.size(), GL_UNSIGNED_INT, (GLubyte*)NULL);
    glBindVertexArray(0);
}

yqkkidmi

yqkkidmi1#

你不能控制网格的三角剖分。有一些关于三角剖分如何工作的基本保证,但在这些之外,它取决于实现。所以无论你在tessellator中做什么,都需要能够与 * 任何 *(合理的)三角剖分一起工作。

相关问题