首页 > 其他分享 >第2章:GLSL基础

第2章:GLSL基础

时间:2024-07-22 12:26:04浏览次数:10  
标签:GLSL 1.0 基础 矩阵 vec3 着色器 向量

   

目录

2.1 GLSL程序的基本结构

2.2 变量声明和数据类型

2.3 向量和矩阵操作

2.4 控制流语句

小结


       在本章中,我们将深入探讨GLSL(OpenGL Shading Language)的基础知识。这些基础知识包括GLSL程序的基本结构、变量声明和数据类型、向量和矩阵操作以及控制流语句。掌握这些基础概念对于编写有效的GLSL着色器至关重要。

2.1 GLSL程序的基本结构

       GLSL着色器程序的基本结构相对简单,但其设计和实现却非常关键。以下是一个典型的GLSL程序的组成部分:

  • 着色器类型:GLSL程序可以包含多种类型的着色器,每种类型负责不同的渲染任务。最常见的着色器类型包括顶点着色器、片段着色器、几何着色器等。
  • 版本声明:每个GLSL着色器程序的开头需要声明使用的GLSL版本。
  • 输入和输出变量:着色器通过输入和输出变量在不同的着色器阶段之间传递数据。
  • 主函数:每个着色器都必须包含一个 main() 函数,这是着色器的入口点,用于执行着色器的主要逻辑。

 

GLSL程序结构示意图

示例:GLSL顶点着色器的基本结构

#version 330 core

layout(location = 0) in vec3 aPos; // 顶点位置输入变量
layout(location = 1) in vec3 aColor; // 顶点颜色输入变量

out vec3 vertexColor; // 从顶点着色器传递到片段着色器的输出变量

uniform mat4 model; // 模型变换矩阵
uniform mat4 view;  // 视图变换矩阵
uniform mat4 projection; // 投影变换矩阵

void main() {
    gl_Position = projection * view * model * vec4(aPos, 1.0); // 计算最终的顶点位置
    vertexColor = aColor; // 传递顶点颜色到片段着色器
}

示例:GLSL片段着色器的基本结构

#version 330 core

in vec3 vertexColor; // 从顶点着色器接收的输入变量
out vec4 FragColor; // 输出到屏幕的颜色值

void main() {
    FragColor = vec4(vertexColor, 1.0); // 设置片段颜色
}

解释

  • #version 330 core:声明使用GLSL版本330核心配置。
  • layout(location = 0) in vec3 aPos:定义输入变量 aPos,表示顶点位置。
  • uniform mat4 model:声明一个uniform变量 model,用于传递变换矩阵。
  • void main():主函数是执行着色器程序的入口点。
2.2 变量声明和数据类型

       在GLSL中,变量的声明和数据类型选择对着色器的功能和性能具有重要影响。GLSL支持多种数据类型,包括标量、向量和矩阵,每种类型有其特定的用途和操作方式。

GLSL数据类型和变量示意图
  • 标量
    • float:表示单精度浮点数,用于存储数值型数据。
    • int:表示整数,用于存储整数型数据。
    • bool:表示布尔值,存储 truefalse

示例

float myFloat = 1.0;
int myInt = 5;
bool myBool = true;
  • 向量
    • vec2:表示二维向量,通常用于存储位置或颜色数据的两个分量。
    • vec3:表示三维向量,常用于表示位置、颜色或方向的三个分量。
    • vec4:表示四维向量,通常用于表示齐次坐标(如顶点位置)或颜色(包含透明度)。

示例

vec2 position2D = vec2(1.0, 2.0); // 二维向量
vec3 color = vec3(1.0, 0.5, 0.2); // 三维向量(颜色)
vec4 position4D = vec4(1.0, 2.0, 3.0, 1.0); // 四维向量(齐次坐标)
  • 矩阵
    • mat2:2x2矩阵,用于二维变换。
    • mat3:3x3矩阵,用于三维变换。
    • mat4:4x4矩阵,用于更复杂的三维变换(如模型变换、视图变换和投影变换)。

示例

mat4 transformationMatrix = mat4(1.0); // 4x4单位矩阵

矩阵操作

  • 矩阵乘法:用于将变换应用到向量上。
  • 矩阵转置和逆矩阵:用于处理更复杂的变换和计算。
2.3 向量和矩阵操作

       在GLSL中,向量和矩阵操作是图形编程的核心,通常用于坐标变换和几何计算。

  • 向量操作

    • 加法vec3 a = vec3(1.0, 2.0, 3.0); vec3 b = vec3(4.0, 5.0, 6.0); vec3 c = a + b;
    • 减法vec3 d = b - a;
    • 点积float dotProduct = dot(a, b); 用于计算两个向量的夹角。
    • 叉积vec3 crossProduct = cross(a, b); 用于计算两个向量的垂直向量。
    • 归一化vec3 normalized = normalize(a); 用于将向量长度归一化为1。
  • 矩阵操作

    • 矩阵乘法mat4 modelViewProjection = projection * view * model;
    • 矩阵转置mat4 transposedMatrix = transpose(matrix);
    • 矩阵逆mat4 inverseMatrix = inverse(matrix);

示例:矩阵与向量的变换

// 计算模型-视图-投影矩阵
mat4 modelViewProjection = projection * view * model;
vec4 transformedPosition = modelViewProjection * vec4(aPos, 1.0);
2.4 控制流语句

       控制流语句用于在GLSL着色器中执行条件判断和循环操作,使得着色器能够处理复杂的逻辑和算法。

  • 条件语句

    • if-else:用于条件判断。
    • 示例
      if (a > b) {
          // 代码块
      } else {
          // 代码块
      }
      

  • 循环语句

    • for:用于固定次数的循环。
    • while:用于条件满足时的循环。
    • do-while:与while类似,但至少执行一次。
    • 示例
      // for循环示例
      for (int i = 0; i < 10; i++) {
          // 代码块
      }
      
      // while循环示例
      int j = 0;
      while (j < 10) {
          // 代码块
          j++;
      }
      
  • 分支和循环控制

    • discard:用于丢弃当前片段(片段着色器中)。
    • break:用于退出循环。
    • continue:用于跳过当前循环的剩余部分。

示例:条件判断和循环

void main() {
    // 条件判断
    if (gl_FragCoord.x < 0.5) {
        FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
    } else {
        FragColor = vec4(0.0, 0.0, 1.0, 1.0); // 蓝色
    }

    // 循环
    for (int i = 0; i < 10; i++) {
        // 计算过程
    }
}

小结

       本章介绍了GLSL的基本结构和核心概念,包括程序的基本结构、变量声明和数据类型、向量和矩阵操作、以及控制流语句。掌握这些基础知识对于编写高效的GLSL着色器和实现各种图形效果至关重要。

标签:GLSL,1.0,基础,矩阵,vec3,着色器,向量
From: https://blog.csdn.net/qq_54098120/article/details/140606346

相关文章

  • 数据结构:基础概念
    一、相关概念概念相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构集合:所有数据在同一个集合中,关系平等。线性:数据和数据之间是一对一的关系树: 一对多图:多对多物理结构(在内存当中的存储关系)顺序存储:数据存放在连续的存储单位中(数组),逻辑关系和物理关......
  • Animate软件基础:代码片段
    FlashASer:Animate2022零基础应用教程之教师篇https://zhuanlan.zhihu.com/p/555447498FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436FlashASer:实用的各种AdobeAnimate软件教程https://zhuanlan.zhihu.com/p/675680471“代码片段”面板使得非编......
  • Animate软件基础:启用、编辑和测试按钮元件
    FlashASer:Animate2022零基础应用教程之教师篇https://zhuanlan.zhihu.com/p/555447498FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436FlashASer:实用的各种AdobeAnimate软件教程https://zhuanlan.zhihu.com/p/675680471FlashASer:Animate2021从入......
  • puppet基础入门
    前言:对于运维人员而言,自动化运维工具是工作必备,不仅可以节省工作时间,还能省心省力,减少人为失误。软工的构建、开发环境都对环境的一致性要求较高。在云下阶段服务器一直采用的是ansible来进行环境配置管理。使用playbook完成服务器环境的初始化交付,命令行对支持服务......
  • ngnix简介和基础
    一、Nginx简介Nginx是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器是一个模块化软件【1】、安装nginx使用源码包编译安装cd/opt#获取nginx的源码包wgethttps://nginx.org/download/nginx-1.24.0.tar.gz安装源码编译安装的依赖yu......
  • Java基础面试题大全 -001
    1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程6、java生态完善2、面向对象和面向过程的区别面向过程:是分析解决问题的步骤,然后用函数......
  • linux系统基础:查找文件 20240722
    在Shell中查找文件是一个常见的任务,可以使用多种工具来完成,例如find、locate、grep等。以下是一些使用这些工具的示例。1.使用find命令find命令是最常用的文件查找工具之一,它在指定目录及其子目录下搜索符合条件的文件。示例:查找/home/user目录下所有以.txt结尾的文件。find......
  • 一天一点点,第四天Python基础
    第一天:一天一点点。Python基础-CSDN博客第二天:一天一点点,接上章Python基础-CSDN博客第三天:一天一点点,第三天Python基础(循环语句)-CSDN博客推导式推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。推导式是一种强大且简洁的语法,适用于生......
  • 深入浅出C语言指针(基础篇)
    目录引言一、认识指针指针是什么? 二、指针变量和地址1.取地址操作符2.指针变量3.解引用操作符 4.指针变量的大小 三、指针和指针类型1.指针的类型2.指针+-整数3.指针的解引用四、const修饰指针变量 1.const修饰指向的数据2.const修饰指针本身3.const同......
  • 一文掌握 Tailwind CSS 基础
    一文掌握TailwindCSS基础工欲善其事,必先利其器先推荐一些好用的工具:TailWindCSS代码提示功能的vscode插件:TailwindCSSIntelliSense再推荐一个TailwindCSS速查网站:https://tailwind.muzhifan.top/本文假定读者已经有一定的CSS基础1宽高1.使用预定义类名如......