了解曲面细分着色器

时间:2018-11-14 19:17:29

标签: opengl-es glsl shader tessellation

我正在尝试在OpenGL ES 3.2中使用镶嵌细分着色器,并尝试遵循2种不同的教程,但均未成功。

我当前正在绘制一个扁平矩形,目的是提高其表面。我在顶点着色器中收到了顶点:

#version 320 es

layout (location = 0) in vec3 position;

out vec3 v_position;

uniform mat4 model_matrix;
uniform mat4 mvp_matrix;

void main() {
    vec4 pos = vec4(position, 1.0);
    v_position = vec3(model_matrix * pos);
    gl_Position = mvp_matrix * vec4(position, 1.0);
}

尝试在曲面细分控件着色器中进行曲面细分:

#version 320 es

layout (vertices = 3) out;

in vec3 v_position[];

out vec3 t_position[];

void main()
{
    // Set the control points of the output patch
    t_position[gl_InvocationID] = v_position[gl_InvocationID];

    // Calculate the tessellation levels
    gl_TessLevelOuter[0] = 3.0;
    gl_TessLevelOuter[1] = 3.0;
    gl_TessLevelOuter[2] = 3.0;
    gl_TessLevelInner[0] = gl_TessLevelOuter[2];
}

然后尝试制作一个最低工作评估着色器:

#version 320 es

layout(triangles, equal_spacing, ccw) in;

in vec3 t_position[];

out vec3 f_position;

uniform mat4 mvp_matrix;

void main() {
    f_position = t_position[0];
    gl_Position = mvp_matrix * vec4(f_position, 1.0);
}

我使用glDrawArrays(GL_PATCHES, 0, vertex_num)称这些着色器。但是,目前我在尝试细分时看不到任何输出。如果相反,我将删除镶嵌细分着色器,并仅使用顶点着色器和片段着色器进行绘制(进行调整后才能进行编译)。我确实看到了矩形网格,所以我确信问题出在我的着色器中。

我没有收到编译错误,并且调用glGetError()不会报告任何错误,因此我认为这是我的逻辑。

编辑:

在抽奖之前,我也要做:

glPatchParameteri(GL_PATCH_VERTICES, 3);

0 个答案:

没有答案