注意问题:
1.glDrawElements(GL_PATCHES, 4, GL_UNSIGNED_SHORT, (const GLvoid *)0);
最后指针要转换为const GLvoid * 形式,避免用NULL,否则会引起可能的调用崩溃问题。
2.采用独立着色器时候,要注意重新定义块。详细见下面代码。
四边形细分域的演示:
定义一个四边形。
static const float position[] = {
-1.0f, -1.0f,-1.0f,
1.0f, -1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
};
static const GLushort tess_quad_indices[] =
{
0, 1, 2,3
};
//定义每个面片定点数量
glPatchParameteri(GL_PATCH_VERTICES, 4);
//基于索引绘制图元
glDrawElements(GL_PATCHES, 4, GL_UNSIGNED_SHORT, (const GLvoid *)0);
着色器代码
//vs
layout(location = 0) in vec3 vs_in_vertex;
out gl_PerVertex{
vec4 gl_Position;
};
void main() {
gl_Position = vec4(vs_in_vertex, 1.0);
}
//tcs
//设置输出每个面片的控制点数目
layout (vertices = 4) out;
in gl_PerVertex
{
vec4 gl_Position;
}gl_in[];
out gl_PerVertex
{
vec4 gl_Position;
} gl_out[];
void main() {
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
gl_TessLevelOuter[0] = 2;
gl_TessLevelOuter[1] = 1;
gl_TessLevelOuter[2] = 1;
gl_TessLevelOuter[3] = 1;
gl_TessLevelInner[0] = 1;
gl_TessLevelInner[1] = 1;
}
//tes
uniform mat4 mvp;
layout(quads, equal_spacing, ccw) in;
in gl_PerVertex
{
vec4 gl_Position;
}gl_in[];
out gl_PerVertex
{
vec4 gl_Position;
};
void main()
{
float u = gl_TessCoord.x;
float omu = 1 - u;
float v = gl_TessCoord.y;
float omv = 1 - v;
gl_Position = mvp*(omu*omv*gl_in[0].gl_Position +
u*omv*gl_in[1].gl_Position+
u*v*gl_in[2].gl_Position+
omu*v*gl_in[3].gl_Position);
}
演示程序 下载:
https://t.xiaomiquan.com/3vJyFuj
持续更新中….