Я только начал с тесселяции OpenGL и столкнулся с проблемой. Я - тесселлирующая серия патчей, образованных по одной вершине. Эти вершины/патчи структурированы в виде сетки, чтобы позднее сформировать ландшафт, создаваемый шумом Перлина.
Проблема, с которой я столкнулся, заключается в том, что начиная со второго патча и после каждого 5 th патча после этого иногда бывает много тесселяции (не так, как я настроил), но большую часть времени он вообще не тесселируется.
Так же:
Два белых круга отмечают высоко/более тесселированные патчи. Также обратите внимание на шаблон несвязанных патчей.
Странно, что он работает на моей Surface Pro 2 (графику Intel HD4400), но ошибки на моем основном настольном компьютере (графика AMD HD6950). Возможно ли, что оборудование плохое?
Патчи генерируются с помощью кода:
vec4* patches = new vec4[m_patchesWidth * m_patchesDepth];
int c = 0;
for (unsigned int z = 0; z < m_patchesDepth; ++z) {
for (unsigned int x = 0; x < m_patchesWidth; ++x) {
patches[c] = vec4(x * 1.5f, 0, z * 1.5f, 1.0f);
c++;
}
}
m_fxTerrain->Apply();
glGenBuffers(1, &m_planePatches);
glBindBuffer(GL_ARRAY_BUFFER, m_planePatches);
glBufferData(GL_ARRAY_BUFFER, m_patchesWidth * m_patchesDepth * sizeof(vec4), patches, GL_STATIC_DRAW);
GLuint loc = m_fxTerrain->GetAttrib("posIn");
glEnableVertexAttribArray(loc);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(vec4), nullptr);
delete(patches);
И нарисовано с помощью:
glPatchParameteri(GL_PATCH_VERTICES, 1);
glBindVertexArray(patches);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glDrawArrays(GL_PATCHES, 0, nrOfPatches);
Vertex Shader:
#version 430 core
in vec4 posIn;
out gl_PerVertex {
vec4 gl_Position;
};
void main() {
gl_Position = posIn;
}
Контрольный шейдер:
#version 430
#extension GL_ARB_tessellation_shader : enable
layout (vertices = 1) out;
uniform float OuterTessFactor;
uniform float InnerTessFactor;
out gl_PerVertex {
vec4 gl_Position;
} gl_out[];
void main() {
if (gl_InvocationID == 0) {
gl_TessLevelOuter[0] = OuterTessFactor;
gl_TessLevelOuter[1] = OuterTessFactor;
gl_TessLevelOuter[2] = OuterTessFactor;
gl_TessLevelOuter[3] = OuterTessFactor;
gl_TessLevelInner[0] = InnerTessFactor;
gl_TessLevelInner[1] = InnerTessFactor;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
Оценочный шейдер:
#version 430
#extension GL_ARB_tessellation_shader : enable
layout (quads, equal_spacing, ccw) in;
uniform mat4 ProjView;
uniform sampler2D PerlinNoise;
out vec3 PosW;
out vec3 Normal;
out vec4 ColorFrag;
out gl_PerVertex {
vec4 gl_Position;
};
void main() {
vec4 pos = gl_in[0].gl_Position;
pos.xz += gl_TessCoord.xy;
pos.y = texture2D(PerlinNoise, pos.xz / vec2(8, 8)).x * 10.0f - 10.0f;
Normal = vec3(0, 1, 0);
gl_Position = ProjView * pos;
PosW = pos.xyz;
ColorFrag = vec4(pos.x / 64.0f, 0.0f, pos.z / 64.0f, 1.0f);
}
Фрагментный шейдер:
#version 430 core
in vec3 PosW;
in vec3 Normal;
in vec4 ColorFrag;
in vec4 PosH;
out vec3 FragColor;
out vec3 FragNormal;
void main() {
FragNormal = Normal;
FragColor = ColorFrag.xyz;
}
Я пытался жестко кодировать различные уровни тесселяции, но это не помогло. Я недавно начал работать с OpenGL, поэтому, пожалуйста, дайте мне знать, если я делаю что-то глупое.
Так кто-нибудь может понять, что может вызвать "мерцание" определенных патчей?
Обновление: У меня был знакомый, который запускал проект, и у него был тот же шаблон мерцающей тесселяции, но неудачные патчи не были нарисованы вообще, кроме как при чрезмерной тесселяции. Он имеет ту же графическую карту, что и я (AMD HD6950).