我正在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);
}
型
1条答案
按热度按时间yqkkidmi1#
你不能控制网格的三角剖分。有一些关于三角剖分如何工作的基本保证,但在这些之外,它取决于实现。所以无论你在tessellator中做什么,都需要能够与 * 任何 *(合理的)三角剖分一起工作。