Я начинаю работать с тесселяцией и у меня есть некоторые проблемы в самом начале. Я пытаюсь визуализировать четырехугольник из двух треугольников с тесселяцией, но на экране ничего не появляется. Но как только я уберу тесселяционные шейдеры и поменяю GL_PATCHES
в GL_TRIANGLES
снова, он снова начинает работать, очевидно, без тесселяции.
Итак, вот мой код для настройки шейдеров тесселяции:
glPatchParameteri(GL_PATCH_VERTICES, 3);
shaderID = glCreateProgram();
{
vertex = GraphicsUtilities::loadShader("D:\\vert.glsl", GL_VERTEX_SHADER);
glAttachShader(shaderID, vertex);fragment = GraphicsUtilities::loadShader("D:\\frag.glsl", GL_FRAGMENT_SHADER);
glAttachShader(shaderID, fragment);
tcs = GraphicsUtilities::loadShader("D:\\tcs.glsl", GL_TESS_CONTROL_SHADER);
glAttachShader(shaderID, tcs);
tes = GraphicsUtilities::loadShader("D:\\tes.glsl", GL_TESS_EVALUATION_SHADER);
glAttachShader(shaderID, tes);
}
glLinkProgram(shaderID);
Это вершинный шейдер:
#version 400
layout(location=0) in vec4 vertPosition;
layout(location=1) in vec2 vertUV;
layout(location=2) in vec3 vertNormal;
void main(void){
gl_Position = vertPosition;
}
TCS:
#version 400
layout (vertices = 3) out;
void main()
{
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
gl_TessLevelOuter[0] = 3.0;
gl_TessLevelOuter[1] = 3.0;
gl_TessLevelOuter[2] = 3.0;
gl_TessLevelInner[0] = 3.0;
}
И TES:
#version 400
layout(triangles, equal_spacing, cw) in;
void main()
{
gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position +
gl_TessCoord.y * gl_in[1].gl_Position +
gl_TessCoord.z * gl_in[2].gl_Position);
}
И вот как я рисую четырехугольник:
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glUseProgram(shaderID);
glBindVertexArray(quad->getVboID());
glDrawElements(GL_PATCHES, 6, GL_UNSIGNED_INT, (GLvoid*)0);
glBindVertexArray(0);
glUseProgram(0);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
Я пытался с помощью in
а также out
переменные вместо gl_in/out
, но это тоже не работает. Я тоже попробовал это без TCS.
Я также использовал Apitrace для поиска любых ошибок, но ничего. Функция loadShader()
ищет ошибки компиляции.
Так что может вызвать эту проблему? Я действительно понятия не имею, как отлаживать эту вещь дальше.
Задача ещё не решена.