glsl 细分着色器

注意问题

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
持续更新中….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值