Понимание тесселяционных шейдеров
Я пытаюсь использовать тесселяционные шейдеры в 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);