LearnOpenGL学习笔记——几何着色器

OpenGL学习笔记(十)-几何着色器-实例化 参考网址:LearnOpenGL 中文版 4.7 几何着色器 4.7.1 基本概念 1、顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点,顶点发送到下一着色器之前可对它们随意变换,将顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。 #version 330 core layout (points) in; layout (line_strip, max_vertices = 2) out; void main() { gl_Posit 阅读详情

几何着色器

在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。废话不多说,我们直接先看一个几何着色器的例子:

#version 330 core
layout (points) in;
layout (line_strip, max_vertices = 2) out;
void main() {    
    gl_Position = gl_in[0].gl_Position + vec4(-0.1, 0.0, 0.0, 0.0); 
    EmitVertex();
    gl_Position = gl_in[0].gl_Position + vec4( 0.1, 0.0, 0.0, 0.0);
    EmitVertex();
    EndPrimitive();
}

在几何着色器的顶部,我们需要声明从顶点着色器输入的图元类型。这需要在in关键字前声明一个布局修饰符(Layout Qualifier)。这个输入布局修饰符可以从顶点着色器接收下列任何一个图元值:

  • points:绘制GL_POINTS图元时(1)。
  • lines:绘制GL_LINES或GL_LINE_STRIP时(2)
  • lines_adjacency:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY(4)
  • triangles:GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(3)
  • triangles_adjacency:GL_TRIANGLES_ADJACENCY或GL_TRIANGLE_STRIP_ADJACENCY(6)
    以上是能提供给glDrawArrays渲染函数的几乎所有图元了。如果我们想要将顶点绘制为GL_TRIANGLES,我们就要将输入修饰符设置为triangles。括号内的数字表示的是一个图元所包含的最小顶点数。接下来,我们还需要指定几何着色器输出的图元类型,这需要在out关键字前面加一个布局修饰符。和输入布局修饰符一样,输出布局修饰符也可以接受几个图元值:
  • points
  • line_strip
  • triangle_strip
    有了这3个输出修饰符,我们就可以使用输入图元创建几乎任意的形状了。要生成一个三角形的话,我们将输出定义为triangle_strip,并输出3个顶点。
    几何着色器同时希望我们设置一个它最大能够输出的顶点数量(如果你超过了这个值,OpenGL将不会绘制多出的顶点),这个也可以在out关键字的布局修饰符中设置。在这个例子中,我们将输出一个line_strip,并将最大顶点数设置为2个。如果你不知道什么是线条(Line Strip):线条连接了一组点,形成一条连续的线,它最少要由两个点来组成。在渲染函数中每多加一个点,就会在这个点与前一个点之间形成一条新的线。在下面这张图中,我们有5个顶点:
    在这里插入图片描述
    如果使用的是上面定义的着色器,那么这将只能输出一条线段,因为最大顶点数等于2。为了生成更有意义的结果,我们需要某种方式来获取前一着色器阶段的输出。GLSL提供给我们一个内建(Built-in)变量,在内部看起来(可能)是这样的:
in gl_Vertex
{
    vec4  gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[];

这里,它被声明为一个接口块(Interface Block,我们在上一节已经讨论过),它包含了几个很有意思的变量,其中最有趣的一个是gl_Position,它是和顶点着色器输出非常相似的一个向量。

要注意的是,它被声明为一个数组,因为大多数的渲染图元包含多于1个的顶点,而几何着色器的输入是一个图元的所有顶点。

有了之前顶点着色器阶段的顶点数据,我们就可以使用2个几何着色器函数,EmitVertex和EndPrimitive,来生成新的数据了。几何着色器希望你能够生成并输出至少一个定义为输出的图元。在我们的例子中,我们需要至少生成一个线条图元。

void main() {
    gl_Position = gl_in[0].gl_Position + vec4(-0.1, 0.0, 0.0, 0.0); 
    EmitVertex();
    gl_Position = gl_in[0].gl_Position + vec4( 0.1, 0.0, 0.0, 0.0);
    EmitVertex();
    EndPrimitive();
}

每次我们调用EmitVertex时,gl_Position中的向量会被添加到图元中来。当EndPrimitive被调用时,所有发射出的(Emitted)顶点都会合成为指定的输出渲染图元。在一个或多个EmitVertex调用之后重复调用EndPrimitive能够生成多个图元。在这个例子中,我们发射了两个顶点,它们从原始顶点位置平移了一段距离,之后调用了EndPrimitive,将这两个顶点合成为一个包含两个顶点的线条。现在你(大概)了解了几何着色器的工作方式,你可能已经猜出这个几何着色器是做什么的了。它接受一个点图元作为输入,以这个点为中心,创建一条水平的线图元。如果我们渲染它,看起来会是这样的:
在这里插入图片描述
目前还并没有什么令人惊叹的效果,但考虑到这个输出是通过调用下面的渲染函数来生成的,它还是很有意思的:

glDrawArrays(GL_POINTS, 0, 4);

使用几何着色器

简单的场景
为了展示几何着色器的用法,我们将会渲染一个非常简单的场景,我们只会在标准化设备坐标的z平面上绘制四个点。这些点的坐标是:

float points[] = {
    -0.5f,  0.5f, // 左上
     0.5f,  0.5f, // 右上
     0.5f, -0.5f, // 右下
    -0.5f, -0.5f  // 左下
};

顶点着色器只需要在z平面绘制点就可以了,所以我们将使用一个最基本顶点着色器:

	#version 330 core
	layout (location = 0) in vec2 aPos;
	void main()
	{
		gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); 
	}
	#version 330 core
	out vec4 FragColor;
	void main()
	{
    	FragColor = vec4(0.0, 1.0, 0.0, 1.0);   
	}

我们将会创建一个传递(Pass-through)几何着色器,它会接收一个点图元,并直接将它传递(Pass)到下一个着色器:

	#version 330 core
	layout (points) in;
	layout (points, max_vertices = 1) out;
	void main() {    
    	gl_Position = gl_in[0].gl_Position; 
    	EmitVertex();
    	EndPrimitive();
	}

和顶点与片段着色器一样,几何着色器也需要编译和链接,但这次在创建着色器时我们将会使用GL_GEOMETRY_SHADER作为着色器类型:

	geometryShader = glCreateShader(GL_GEOMETRY_SHADER);
	glShaderSource(geometryShader, 1, &gShaderCode, NULL);
	glCompileShader(geometryShader);  
	...
	glAttachShader(program, geometryShader);
	glLinkProgram(program);

这和没使用几何着色器时是完全一样的!我承认这是有点无聊,但既然我们仍然能够绘制这些点,所以几何着色器是正常工作的,现在是时候做点更有趣的东西了!

爆破物体
当我们说爆破一个物体时,我们并不是指要将宝贵的顶点集给炸掉,我们是要将每个三角形沿着法向量的方向移动一小段时间。效果就是,整个物体看起来像是沿着每个三角形的法线向量爆炸一样。这样的几何着色器效果的一个好处就是,无论物体有多复杂,它都能够应用上去。

因为我们想要沿着三角形的法向量位移每个顶点,我们首先需要计算这个法向量。我们所要做的是计算垂直于三角形表面的向量,仅使用我们能够访问的3个顶点。你可能还记得在变换小节中,我们使用叉乘来获取垂直于其它两个向量的一个向量。如果我们能够获取两个平行于三角形表面的向量a和b,我们就能够对这两个向量进行叉乘来获取法向量了。下面这个几何着色器函数做的正是这个,来使用3个输入顶点坐标来获取法向量:

vec3 GetNormal()
{
   vec3 a = vec3(gl_in[0].gl_Position) - vec3(gl_in[1].gl_Position);
   vec3 b = vec3(gl_in[2].gl_Position) - vec3(gl_in[1].gl_Position);
   return normalize(cross(a, b));
}

这里我们使用减法获取了两个平行于三角形表面的向量a和b。因为两个向量相减能够得到这两个向量之间的差值,并且三个点都位于三角平面上,对任意两个向量相减都能够得到一个平行于平面的向量。注意,如果我们交换了cross函数中a和b的位置,我们会得到一个指向相反方向的法向量——这里的顺序很重要!

vec4 explode(vec4 position, vec3 normal)
{
    float magnitude = 2.0;
    vec3 direction = normal * ((sin(time) + 1.0) / 2.0) * magnitude; 
    return position + vec4(direction, 0.0);
}

当使用我们的模型加载器绘制一个模型时,爆破(Explode)效果的完整几何着色器是这样的:

#version 330 core
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

in VS_OUT {
    vec2 texCoords;
} gs_in[];

out vec2 TexCoords; 

uniform float time;

vec4 explode(vec4 position, vec3 normal) { ... }
vec3 GetNormal() { ... }

void main() {    
    vec3 normal = GetNormal();
    gl_Position = explode(gl_in[0].gl_Position, normal);
    TexCoords = gs_in[0].texCoords;
    EmitVertex();
    gl_Position = explode(gl_in[1].gl_Position, normal);
    TexCoords = gs_in[1].texCoords;
    EmitVertex();
    gl_Position = explode(gl_in[2].gl_Position, normal);
    TexCoords = gs_in[2].texCoords;
    EmitVertex();
    EndPrimitive();
}

在这里插入图片描述
法向量可视化
在这一部分中,我们将使用几何着色器来实现一个真正有用的例子:显示任意物体的法向量。当编写光照着色器时,你可能会最终会得到一些奇怪的视觉输出,但又很难确定导致问题的原因。光照错误很常见的原因就是法向量错误,这可能是由于不正确加载顶点数据、错误地将它们定义为顶点属性或在着色器中不正确地管理所导致的。我们想要的是使用某种方式来检测提供的法向量是正确的。检测法向量是否正确的一个很好的方式就是对它们进行可视化,几何着色器正是实现这一目的非常有用的工具。

思路是这样的:我们首先不使用几何着色器正常绘制场景。然后再次绘制场景,但这次只显示通过几何着色器生成法向量。几何着色器接收一个三角形图元,并沿着法向量生成三条线——每个顶点一个法向量。伪代码看起来会像是这样:

	shader.use();
	DrawScene();
	normalDisplayShader.use();
	DrawScene();

这次在几何着色器中,我们会使用模型提供的顶点法线,而不是自己生成,为了适配(观察和模型矩阵的)缩放和旋转,我们在将法线变换到裁剪空间坐标之前,先使用法线矩阵变换一次(几何着色器接受的位置向量是剪裁空间坐标,所以我们应该将法向量变换到相同的空间中)。这可以在顶点着色器中完成:

	#version 330 core
	layout (location = 0) in vec3 aPos;
	layout (location = 1) in vec3 aNormal;
	out VS_OUT {
    	vec3 normal;
	} vs_out;

	uniform mat4 projection;
	uniform mat4 view;
	uniform mat4 model;
	void main()
	{
    	gl_Position = projection * view * model * vec4(aPos, 1.0); 
    	mat3 normalMatrix = mat3(transpose(inverse(view * model)));
    	vs_out.normal = normalize(vec3(projection * vec4(normalMatrix * aNormal, 0.0)));
	}

变换后的裁剪空间法向量会以接口块的形式传递到下个着色器阶段。接下来,几何着色器会接收每一个顶点(包括一个位置向量和一个法向量),并在每个位置向量处绘制一个法线向量:

	#version 330 core
	layout (triangles) in;
	layout (line_strip, max_vertices = 6) out;
	in VS_OUT {
    	vec3 normal;
	} gs_in[];
	//像这样的几何着色器应该很容易理解了。注意我们将法向量乘以了一个MAGNITUDE向量,来限制显示出的法向量大小(否则它们就有点大了)。
	const float MAGNITUDE = 0.4;
	void GenerateLine(int index)
	{
    	gl_Position = gl_in[index].gl_Position;
   	 	EmitVertex();
    	gl_Position = gl_in[index].gl_Position + vec4(gs_in[index].normal, 0.0) * MAGNITUDE;
    	EmitVertex();
    	EndPrimitive();
	}
	void main()
	{
    	GenerateLine(0); // 第一个顶点法线
    	GenerateLine(1); // 第二个顶点法线
    	GenerateLine(2); // 第三个顶点法线
	}

因为法线的可视化通常都是用于调试目的,我们可以使用片段着色器,将它们显示为单色的线(如果你愿意也可以是非常好看的线):

	#version 330 core
	out vec4 FragColor;
	void main()
	{
    	FragColor = vec4(1.0, 1.0, 0.0, 1.0);
	}

在这里插入图片描述

知识点总结:

1.什么是几何着色器
2.几何着色器输入声明和输出声明
3.GLSL 给我们提供了内建变量gl_in[]
4.EmitVertex 和 EndPrimitive
5.如何爆破物体(使用几何着色器)
6.如何让法向量可视化(使用几何着色器)

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/09%20Geometry%20Shader/

OpenGL学习脚印:几何着色器(geometry shader) 写在前面 一直以来我们使用了顶点着色器(vertex shader)和片元着色器(fragment shader),实际上OpenGL还提供了一个可选的几何着色器(geometry shader)。几何着色器位于顶点和片元着色器之间,如果没有使用时,则顶点着色器输出到片元着色器,在使用几何着色器后,顶点着色器输出组成一个基础图元的顶点信息到几何着色器,经过几何着色器处理后,再输出到片元着色 阅读详情

相关推荐

【LearnOpenGL 学习笔记】高级OpenGL

LearnOpenGL 学习笔记 高级OpenGL

weixin_42489848的博客 557

✠OpenGL-13-几何着色器

目录OpenGL中的逐个图元处理修改图元删除图元添加图元更改图元类型补充说明 与曲面细分一样,几何着色器使程序员能够以顶点着色器中无法实现的方式操纵顶点组。在某些情况下,可以使用曲面细分着色器或者几何着色器完成同样的任务,因为它们的功能在某些方面重叠。 几何着色器(Geometry Processor)是一个可编程单元,它对输入顶点的数据进行操作在顶点处理后组装的基本体,并输出形成输出的顶点序列原语。使用OpenGL着色语言编写并在此处理器上运行的编译单元是称为几何着色器。成功编译和链接一组几何着色器后,它

itzyjr的专栏 1537

LearnOpenGL——几何着色器、实例化

在顶点着色器和片元着色器之间还有一个可选的几何着色器,几何着色器输入的是一个图元(点或者三角形)的一组顶点,几何着色器可以在片元着色器之前对它们进行随意变化,可以变换为不同的图元,也可以生成更多的顶点。我们需要声明从顶点着色器输入的图元类型——在in前面加一个布局修饰符(如下),如果我们要绘制三角形,就将修饰符修改为triangles,括号内的数字表示的是一个图元所包含的最小顶点数。几何着色器,会接收每一个顶点(包括一个位置向量和一个法向量),并在每个位置向量处绘制一个法线向量。

weixin_70073176的博客 1311

OpenGL之几何着色器(Geometry Shader)详解

OpenGL学习笔记

What_can_you_do的博客 2557

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1043

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败

uniapp开发小程序体验版接口请求失败(真机可以)

weixin_60408555的博客 3954

十三、D3D12学习笔记——几何着色器

几何着色器,渲染流水线上的关系户,总是有一些权限来大刀阔斧的修改,将从VS出来的旧图元修改为新图元传到PS等后续流水线上。

weixin_44212242的博客 1543

基于ROS2的无人机野生动物巡查系统设计

自主巡检系统是嵌入式人工智能与机器人技术融合的关键应用方向,其核心在于多源感知融合、实时路径规划与端侧智能识别的协同实现。原理上依赖SLAM定位构建环境地图,结合栅格化建模与混合路径算法(如蚁群+BFS)达成全覆盖遍历;技术价值体现在资源受限平台下的确定性响应与时空对齐能力,支撑高鲁棒性野外作业。典型应用场景包括生态监测、禁飞区巡检及小尺度智能安防。本文围绕ROS2 Humble中间件架构、Livox激光雷达与MaixCAM视觉协同、YOLO11n INT8模型端侧部署等关键技术展开,突出嵌入式AI与实时控

weixin_30598047的博客 649

【OpenGL】LearnOpenGL学习笔记19 - 几何着色器 Geometry Shader

LearnOpenGL学习笔记 - 几何着色器 Geometry Shader

Duo1J的随笔 1289

解锁轻量化网络实验室:在 Containerlab 中部署 Cisco IOL 设备的详细教程

Cisco IOS On Linux(IOL)是 Cisco IOS-XE 的简化版,它是 Cisco IOS 的一种轻量级实现。IOL 并不需要完整的虚拟机(Virtual Machine, VM)环境,可以直接在 Linux 上运行,极大地减少了对系统资源的需求。IOL 节点通过更精简的方式提供了 Cisco IOS 功能,适合构建实验室、测试网络协议和验证网络设计。

网络技术联盟站 476

在MATLAB和Simulink中设计并仿真一个电动汽车BMS热管理系统

电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池安全运行、延长寿命和提高性能的关键环节。通过Simulink进行BMS热管理仿真是验证控制策略的有效性、优化散热设计并降低开发成本的重要手段。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车BMS热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车BMS热管理系统仿真。

xiaoheshang_123的博客 702

LearnOpenGL学习笔记—高级OpenGL 09:几何着色器

LearnOpenGL学习笔记—高级OpenGL 09:几何着色器1 几何着色器知识2 实现:使用几何着色器3 实现:造几个房子4 爆破物体4.1 代码文件5 (待定)法向量可视化 本节对应官网学习内容:几何着色器 1 几何着色器知识 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。 几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。 然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,

清清!的博客 1054

YOLOv11模型改进:利用注意力机制实现小目标检测精度跃升

如果你在实操中遇到精度提升不明显或速度下降过多的问题,不妨尝试调整注意力模块的类型(如替换为CA)或插入层级,或针对性优化小目标的数据集增强策略。记住,小目标检测的核心是“特征强化与空间定位”,只要结合业务场景灵活调整注意力模块的组合,你也能让YOLOv11在小目标识别任务中脱颖而出。接下来,我们从模块选型到代码落地,一步步带你打造“小目标检测专精版”YOLOv11,真正帮你解决工业场景中(如安防、质检)的小目标识别痛点。在城市安防场景中,改进后的YOLOv11对远处行人、车辆(小目标)的识别准确率提升。

m0_71589036的博客 454

(自用)learnOpenGL学习总结-高级OpenGL-几何着色器

在顶点着色器和片段着色器中间还有一个几何着色器。几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。这是一个几何着色器的例子。我们不仅用这一帧的着色器输出,我们还会使用上一帧的着色器变量来进行更多变化。

SHIgaNatsuki的博客 1379

从 QQ 聊天到 AI Agent:AstrBot + NapCat 接入 DeepSeek

<think>我们根据要求,根据提供的内容生成≤150字的文章摘要。内容是关于在Windows上使用Docker部署AstrBot+NaPCat,配置DeepSeek,实现QQ AI机器人。摘要需简洁概括主要步骤和结论。注意字数。</think>在Windows 11上通过Docker一键部署AstrBot与NapCat,实现QQ机器人。NapCat扫码登录QQ,AstrBot接入并配置DeepSeek API,完成AI对话。后续可扩展人格、插件及MCP工具,并通过cpolar提供公网管理入口,打造可扩展的

天道酬勤 1万+

【忍者算法】从拼积木到最长连续序列:一道别出心裁的数组题目|LeetCode 128 最长连续序列

本题核心:通过预处理数据结构来优化查找!

忍者算法的博客 738

LearnOpenGL-高级OpenGL-9.几何着色器

# 几何着色器 - 简介 - 在顶点和片段着色器之间有一个**可选**的几何着色器 - 几何着色器的输入是一个图元(如点或三角形)的一组顶点。 - 几何着色器可以在顶点发送到下一着色器阶段之前对它们**随意变换**

qq_34060370的博客 1238

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LearnOpenGL——高级OpenGL(九)几何着色器

几何着色器是位于顶点和片段着色器之间的可选阶段,它能够对输入的图元顶点进行变换,甚至生成完全不同的图元和更多顶点。通过定义输入/输出图元类型和最大顶点数,几何着色器可以灵活地重构图形。示例展示了如何将输入的点图元转换为线图元或三角形带,动态生成房屋等复杂形状。使用EmitVertex和EndPrimitive函数控制顶点输出,结合三角形带的高效绘制方式,几何着色器为图形渲染提供了强大的动态生成能力,显著扩展了着色器管线的可能性。

QQ805009795的博客 646

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

learnOpenGL 4.9 几何着色器

在顶点着色器和片元着色器之间还有一个可选的几何着色器。 几何着色器的一大特点,是它可以输入和输出图元(点,线,三角形)。 以下是具体可以输入的类型 points:绘制GL_POINTS图元时(1)。 lines:绘制GL_LINES或GL_LINE_STRIP时(2) lines_adjacency:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY(4) triangles:GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(3)

qq_43533956的博客 179

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

float 输出变量,用于控制渲染型图元时,点的大小。可用于粒子系统。将其设置为 gl_Position.z 时,可以使点的距离越远,大小越大。创建出类似近视眼看远处灯光的效果//也是需要开启int 型输入变量(只读),存储了正在绘制顶点的ID(当(使用glDrawElements)进行索引渲染的时候,这个变量会存储正在绘制顶点的当前索引。当(使用glDrawArrays)不使用索引进行绘制的时候,这个变量会储存从渲染调用开始的已处理顶点数量。

zaizai1007的博客 1238

【实践LearnOpenGL项目】高级篇

本文介绍了OpenGL中的四项高级渲染技术:1. 实例化渲染技术,通过glDraw*Instanced实现3万个陨石的高效渲染,避免了循环绘制的性能损耗;2. 离屏抗锯齿技术,通过多重采样帧缓冲和后处理帧缓冲消除图形边缘锯齿;3. 统一缓冲对象(UBO)技术,用于在多个着色器间共享矩阵和光源参数;4. 几何着色器应用,演示了通过几何着色器实现三角形爆炸效果。每种技术都配有核心代码片段和实际效果图,展示了从基础渲染到高级优化的完整解决方案。

qq_37378423的博客 2218

几何着色器与实例化渲染优化

文章详细介绍了现代图形渲染中的两项关键技术:几何着色器和实例化渲染。几何着色器作为顶点和片段着色器之间的关键环节,能够处理图元数据并生成新的几何图形,特别适合实现爆炸效果等复杂视觉效果。文章通过代码示例和序列图详细解释了几何着色器的工作原理和实现方法。同时,深入探讨了实例化渲染技术如何通过单次绘制调用渲染大量相同对象,大幅减少CPU到GPU的通信开销,显著提升渲染性能。 ## 几何着色器原理与

gitblog_00959的博客 784

LearnOpenGL 学习笔记 高级 OpenGL

将一个多重采样的纹理图像不进行还原直接传入着色器也是可行的。GLSL提供了这样的选项,让我们能够对纹理图像的每个子样本进行采样,所以我们可以创建我们自己的抗锯齿算法。在大型的图形应用中通常都会这么做。要想获取每个子样本的颜色值,你需要将纹理uniform采样器设置为sampler2DMS,而不是平常使用的sampler2D:使用texelFetch函数就能够获取每个子样本的颜色值了:// 第4个子样本我们不会深入探究自定义抗锯齿技术的细节,这里仅仅是给你一点启发。

hijackedbycsdn的博客 1241

LearnOpenGL笔记——四、高级OpenGL:“几何着色器”、“实例化”和“抗锯齿”

四、高级OpenGL:“几何着色器”、“实例化”和“抗锯齿” 4.9 几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点 几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换 然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点 废话不多说,我们直接先看一个几何着色器的例子:#version 330 core layout (points) in; la

weixin_44478658的博客 437

LearnOpenGL CN学习笔记3-渲染第一个三角形

一、图形渲染管线 简介 下图是图形渲染管线的每个阶段的抽象展示。 图形渲染管线 其中,蓝色部分代表的是我们可以注入自定义的着色器的部分。 顶点着色器(Vertex Shader),几何着色器(Geometry Shader),片段着色器(Fragment Shader)。 在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器。 顶点着色器(Vertex Shader):处理3维顶点; 片段着色器(Fragment Shader):光栅化后处理每个像素的颜色,很多特效在这里完..

jean7155的专栏 1199

LearnOpenGL——SSAO学习笔记

SSAO是一项屏幕采样技术,由于我们没有物体的几何信息,我们就需要将每个片元的几何数据渲染成屏幕空间的纹理,然后将这些纹理发给SSAO着色器,这样就可以访问每个片元的几何数据。shaderSSAO的片元着色器,会接受G-Buffer中的数据,也接受噪声纹理和法向半球核心样本作为输入参数,最终结果是一个灰度值,表示当前片段的遮蔽程度。由于平铺的随机向量纹理保持了一致的随机性,我们可以使用这一性质来创建一个简单的模糊着色器:对当前像素和其邻近像素进行采样,并计算加权平均值来代替当前像素的值。

weixin_70073176的博客 1196
上一篇: LearnOpenGL学习笔记——高级GLSL
下一篇: LearnOpenGL学习笔记——实例化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值