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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GLSL是一种高级着色语言,用于编写OpenGL着色器。其中,片源着色器是其中的一种。在GLSL中,一个片元代表一个像素,片元着色器会在每个像素处运行一次,计算出对应像素的最终颜色。 这篇GLSL片源着色器教程将会介绍一些基本的概念和操作,包括数据类型、变量、控制流语句、函数和一些常用的函数库。 在编写GLSL片源着色器时,我们需要定义一些输入和输出变量,以便与其他部分的着色器和应用程序进行通信,在片源着色器中主要是传入顶点数据,其中包括顶点的位置、法线、纹理坐标等。我们还可以声明一些中间变量和输出变量用于存储过程中计算出的结果,这些变量是片源着色器中非常重要的概念。 在GLSL片源着色器中,我们可以使用控制流语句来进行条件判断和循环,这些语句类似于其他编程语言中的语句,包括if/else、for、while等。 GLSL着色语言提供了许多内置函数和库,来进行常用的计算、采样、光照和常见效果的计算等。在编写片源着色器时,使用这些函数和库可以显著地简化代码,加速处理速度。 总之,GLSL片源着色器是OpenGL实现高效渲染的关键部分。熟练掌握GLSL片源着色器的编写技巧,可以帮助我们编写高效的渲染引擎和处理器。 ### 回答2: GLSL是OpenGL着色器语言的标准,它用于编写图形渲染的着色器程序。其中的一种着色器就是片源着色器。片源着色器是在像素级别对图形的颜色进行处理的程序。GLSL片源着色器的编写其实非常简单,只需要使用一些基本的语言结构,就可以进行像素级别的颜色处理了。 首先,我们要定义变量。GLSL是强类型编程语言,所以要先定义需要用到的变量。可以定义各种类型的变量,比如int、float、vec2、vec3等。 其次,我们要获取图形的当前像素坐标和颜色。片源着色器可以访问当前像素的坐标和颜色信息。这两个变量可以通过gl_FragCoord和gl_FragColor来获取。 然后,我们可以对颜色进行各种处理。GLSL提供了各种内置函数,可以对颜色进行处理复杂的运算。我们也可以自定义一些函数来进行更加复杂的颜色操作。 最后,我们可以将处理后的颜色写入到渲染缓冲区中。这个可以通过gl_FragColor来实现。 总之,GLSL片源着色器的编写非常简单,只需要掌握一些基本的语言结构就可以了。要实现复杂的效果,可以结合使用各种运算和内置函数。通过灵活使用GLSL片源着色器,可以实现各种炫酷的图形渲染效果。 ### 回答3: GLSL是OpenGL着色语言的缩写,它是一种高级着色器语言。在OpenGL中,着色器被用于渲染物体和场景。 GLSL着色器分为两种类型,分别是顶点着色器和片源着色器。其中,片源着色器用于计算每个像素的颜色值。 GLSL片源着色器教程的目的是为了帮助开发者了解如何创建自己的着色器程序。在GLSL中,着色器程序由一系列指令组成,这些指令被称为着色器代码。 首先,我们需要创建一个基本的片源着色器程序。在GLSL中,片源着色器程序由以下几个部分组成:输入,输出和主程序。 输入部分定义了着色器需要接收的数据类型,包括颜色,法线向量等。输出部分定义了着色器程序需要返回的颜色值。主程序部分包括了对输入数据的处理和计算步骤。 在GLSL中,像素颜色值是通过处理输入数据得出的,具体的颜色计算过程可以在主程序中实现。通过这种方式,开发者可以利用GLSL着色器来创建各种不同的效果和渲染方式。 总之,如果你想学习GLSL片源着色器编程,你需要了解着色器程序的基本结构和语法,掌握各种自定义函数和变量,以及学会在主程序中进行高级计算和渲染操作。这些技能将有助于你创建出最佳的渲染效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值