LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器,实例化)

高级GLSL

内建变量

顶点着色器

gl_PointSoze : float 输出变量,用于控制渲染 GL_POINTS 型图元时,点的大小。可用于粒子系统。将其设置为 gl_Position.z 时,可以使点的距离越远,大小越大。创建出类似近视眼看远处灯光的效果

glEnable(GL_PROGRAM_POINT_SIZE);   //也是需要开启

void main()
{gl_Position = projection * view * model * vec4(aPos, 1.0);    gl_PointSize = gl_Position.z;    
}

gl_vertexID: int 型输入变量(只读),存储了正在绘制顶点的ID(当(使用glDrawElements)进行索引渲染的时候,这个变量会存储正在绘制顶点的当前索引。当(使用glDrawArrays)不使用索引进行绘制的时候,这个变量会储存从渲染调用开始的已处理顶点数量。)

片段着色器

gl_FragCoord: vec4型输出变量。存储了屏幕空间坐标(x,y ,以窗口左下角为原点)和图元深度值(z,0 - 1).常用来获取深度值。

我们已经使用glViewport设定了一个800x600的窗口了,所以片段窗口空间坐标的x分量将在0到800之间,y分量在0到600之间。

void main()
{             if(gl_FragCoord.x < 400)FragColor = vec4(1.0, 0.0, 0.0, 1.0);elseFragColor = vec4(0.0, 1.0, 0.0, 1.0);        
}

gl_FrontFacing:  bool 型输入变量。标记了当前图元是否为正面

#version 330 core
out vec4 FragColor;in vec2 TexCoords;uniform sampler2D frontTexture;
uniform sampler2D backTexture;void main()
{             if(gl_FrontFacing)FragColor = texture(frontTexture, TexCoords);elseFragColor = texture(backTexture, TexCoords);
}

给立方体里外使用不同的纹理:

 

gl_FragDepth :float 型输出变量。用于手动设置片段的深度值。在片段着色器中出现后,Early-Z 将被禁用

gl_FragDepth = 0.0; // 这个片段现在的深度值为 0.0
//如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值。

从OpenGL 4.2起,我们仍可以对两者进行一定的调和,在片段着色器的顶部使用深度条件(Depth Condition)重新声明gl_FragDepth变量:

layout (depth_<condition>) out float gl_FragDepth;

这样子的话,当深度值比片段的深度值要小的时候,OpenGL仍是能够进行提前深度测试的。

接口块

但当程序变得更大时,你希望发送的可能就不只是几个变量了,它还可能包括数组和结构体。

接口块的声明和struct的声明有点相像,不同的是,现在根据它是一个输入还是输出块(Block),使用inout关键字来定义的。

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoords;uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;out VS_OUT
{vec2 TexCoords;
} vs_out;void main()
{gl_Position = projection * view * model * vec4(aPos, 1.0);    vs_out.TexCoords = aTexCoords;
}

这次我们声明了一个叫做vs_out的接口块,它打包了我们希望发送到下一个着色器中的所有输出变量

之后,我们还需要在下一个着色器,即片段着色器,中定义一个输入接口块。

#version 330 core
out vec4 FragColor;in VS_OUT
{vec2 TexCoords;
} fs_in;uniform sampler2D texture;void main()
{             FragColor = texture(texture, fs_in.TexCoords);   
}

只要两个接口块的名字一样,它们对应的输入和输出将会匹配起来。这是帮助你管理代码的又一个有用特性,它在几何着色器这样穿插特定着色器阶段的场景下会很有用。

Uniform 缓冲对象

OpenGL为我们提供了一个叫做Uniform缓冲对象(Uniform Buffer Object)的工具,它允许我们定义一系列在多个着色器程序中相同的全局Uniform变量。当使用Uniform缓冲对象的时候,我们只需要设置相关的uniform一次

参考:高级GLSL - LearnOpenGL CN

LearnOpenGL学习笔记(十) - 高级GLSL、几何着色器、实例化与抗锯齿 - Yoi's Home 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488119.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java之集合(详细-Map,Set,List)

1集合体系概述 1.1集合的概念 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 1.2集合分类 集合分为单列集合和多列集合 Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff…

手机租赁系统开发指南一站式服务流程解析

内容概要 手机租赁系统的开发是一个复杂但有趣的过程&#xff0c;像搭建乐高一样&#xff0c;只要找到合适的模块&#xff0c;就能打造出一个宾至如归的租赁平台。在这部分&#xff0c;我们将对开发流程的整体结构进行简要概述&#xff0c;并指出每个环节的重要性。 首先&…

CS5563国产DP转HDMI芯片支持10k@60Hz视频转换IC

CS5563 4Lane DP to HDMI2.1 10k60Hz适用各种TYPEC/DP转HDMI8K60HZ方案 。深圳市安格瑞科技代理的ASL芯片系列DP转HDMI视频转换方案提供了CS5263、CS5563三个型号供选择。这些芯片在性能和功能上各有特点&#xff1a; CS5263专为高性能打造&#xff0c;支持DP到HDMI2.0的4k60H…

JS进阶DAY5|本地存储

嗨&#xff5e;&#x1f44b; 欢迎来到JavaScript本地存储的世界。在这里&#xff0c;我们可以像烘焙师一样&#xff0c;将数据烘焙成小饼干&#xff08;cookies&#xff09;&#xff0c;或者将它们保存在冰箱&#xff08;localStorage&#xff09;里&#xff0c;以便下次访问时…

HTA8998 实时音频跟踪的高效内置升压2x10W免电感立体声ABID类音频功放

1、特征 输出功率(fIN1kHz,RL4Ω&#xff0c;BTL) VBAT 4V, 2x10.6W(VOUT9V,THDN10%) VBAT 4V, 2x8.6W (VOUT9V,THDN1%) 内置升压电路模式可选择:自适应实时音频跟踪 升压(可提升播放时间50%以上)、强制升压 最大升压值可选择&#xff0c;升压限流值可设置 ACF防破音功能 D类…

深度学习:重塑学校教育的未来

摘要&#xff1a;本文旨在全面剖析深度学习技术在教育领域的应用现状及未来前景。通过对当前深度学习技术在教育中的应用案例进行深入剖析&#xff0c;探讨其在教学效果、学习体验等方面的积极作用&#xff0c;同时分析存在的挑战与问题。在此基础上&#xff0c;本文将进一步展…

React - echarts 世界地图,中国地图绘制

中国地图 首先需要一个包含中国所有省份名称的 json&#xff0c;这个好多网站都能找到。 我传到资源里了&#xff0c;放百度网盘怕太长时间不登录给我删掉了。 中国地图中文版json 我把地图抽出来单独做成了组件&#xff0c;这样用的时候比较方便. 使用的时候&#xff1a; …

【Redis源码】网络模型

Redis源码解析网络模型 基于Redis7源码的网络模型解析 前置准备 源码地址&#xff1a;https://github.com/redis/redis Ide&#xff1a;Clion 网络模型 流程节点下方是源码中对应的方法 总结点 Redis 的网络是IO多路复用指令还是单线程串行 扩展的线程池&#xff0c;协助主…

Python基础笔记17--面向对象(其他)

一、面向对象的三大特性 1、封装 1、 将属性和⽅法书写到类的⾥⾯的操作 2、封装可以为属性和⽅法添加私有权限 2、继承 1、⼦类默认继承⽗类的所有属性和⽅法 2、⼦类可以重写⽗类属性和⽅法 3、多态 1、 传⼊不同的对象&#xff0c;产⽣不同的结果 二、多态 多态指⼀类事…

【QNX】RUN模型的时候,如何监测HTP的使用率?

首先,RUN模型的时候,如何监测HTP的使用率? 使用HTP运行设备端模型的步骤可参考:【QNX】车芯 | 设备端使用HTP运行模型-CSDN博客 监测HTP的使用率的方案如下:设备上,需要起两个窗口。第一个窗口用于跑模型,第二个窗口用于监测。 具体步骤如下:

Spann3R:基于DUSt3R的密集捕获数据增量式重建方法

来自作者Hengyi Wang在b站3D视觉工坊中对于该论文透彻的讲解&#xff0c;这里是相关重要部分的截屏。这篇博客的用途主要是自己做记录&#xff0c;其次分享给感兴趣的同学&#xff0c;最后谢谢作者大佬的认真讲解。 作者是按照这样的次序来介绍的&#xff1a; 首先从传统的三…

Qt 联合Halcon配置

文章目录 配置代码窗口绑定 配置 选择添加库 选择外部库 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

Ansible自动化运维(三)playbook剧本详解

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …

React Router 6的学习

安装react-router-dom npm i react-router-dom 支持不同的路由创建 createBrowserRouter 特点 推荐使用的方式&#xff0c;基于 HTML5 的 History API。支持用户友好的 URL&#xff0c;无需 #。适用于生产环境的绝大多数场景。 适用 使用现代浏览器&#xff0c;支持 pus…

jQuery漏洞——CVE-2020-11022/CVE-2020-11023,保姆篇---春不晚

漏洞号&#xff1a;CVE-2020-11022/CVE-2020-11023 漏洞概况及影响 该类风险为应用安全缺陷类DXSS攻击&#xff0c;攻击者可以利用该漏洞注入恶意脚本代码&#xff0c;并在受害者的浏览器上执行。将导致受害者的个人信息泄露、账户被劫持、会话被劫持等安全问题。 一、漏洞版…

Qt编写的文件传输工具

使用QT编写的文件传输工具 文件传输工具通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 文件传输工具 通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 收到的广播消息可以显示在IP地址列表中&#xff0c;点击IP地址可以自动填充到IP地址栏内 选择文件…

Certimate自动化SSL证书部署至IIS服务器

前言&#xff1a;笔者上一篇内容已经部署好了Certimate开源系统&#xff0c;于是开始搭建部署至Linux和Windows服务器&#xff0c;Linux服务器十分的顺利&#xff0c;申请证书-部署证书很快的完成了&#xff0c;但是部署至Windows Server的IIS服务时&#xff0c;遇到一些阻碍&a…

aippt:AI 智能生成 PPT 的开源项目

aippt&#xff1a;AI 智能生成 PPT 的开源项目 在现代办公和学习中&#xff0c;PPT&#xff08;PowerPoint Presentation&#xff09;是一种非常重要的展示工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题&#xff0c;aippt项目应运…

3D 生成重建032-Find3D去找到它身上的每一份碎片吧

3D 生成重建032-Find3D去找到它身上的每一份碎片吧 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 该论文研究三维开放世界部件分割问题&#xff1a;基于任何文本查询分割任何物体中的任何部件。以往的方法在物体类别或部件词汇方面存在局限性。最近人工智能的进步在二…

对于《穿越火线》和《欢乐升级》游戏的理解

对于《穿越火线》的理解与感受 《穿越火线》&#xff08;CrossFire&#xff09;是一款承载了许多玩家青春记忆的经典FPS游戏。在初次接触这款游戏时&#xff0c;它给我的第一感觉是紧张刺激且极具沉浸感。无论是团队竞技的快节奏对抗&#xff0c;还是爆破模式中步步为营的策略…