当前位置: 首页 > news >正文

12.3 OpenGL顶点后处理:平面着色

平面着色 Flatshading

Flat shading (平面着色)是一种简化渲染技术,它在光栅化阶段将一个图元(primitive)的所有顶点赋予相同的颜色或其它输出变量的值。这些赋予的值来自于该图元的“引发顶点”(provoking vertex)。

可以通过glProvokingVertex函数来控制选取哪个顶点作为引发顶点:

void glProvokingVertex(enum provokeMode);

其中provokeMode可以是以下两个枚举值之一:

  1. FIRST_VERTEX_CONVENTION:在这种模式下,一个多边形的第一个顶点的输出值会被用于所有其他顶点的平滑着色。
  2. LAST_VERTEX_CONVENTION:这是OpenGL的默认设置,意味着一个多边形的最后一个顶点的输出值将被用于整个图元的平滑着色。

在OpenGL着色语言(GLSL)中,当定义用户自定义的顶点着色器输出时,若想使某个输出变量进行平面着色处理,可以在声明输出变量时使用flat限定符。例如:

out flat vec4 flatColor;

这意味着无论多边形内部如何插值,所有组成该多边形的像素都将获得同一颜色值,这个值就是由引发顶点计算得到的那个颜色值。平面着色所需的OpenGL状态只包含一个位,即引发顶点模式,初始值为LAST_VERTEX_CONVENTION

例如,假设我们有一个顶点着色器,在其中定义了一个带有flat限定符的颜色输出:

#version 330 corein vec4 vertexPosition;
in vec4 vertexColor;out flat vec4 flatVertexColor; // 使用 'flat' 限定符声明的输出变量void main() {gl_Position = vertexPosition;if (vertexPosition.y > 0.5) { // 假设y坐标大于0.5的顶点颜色为红色flatVertexColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色} else {flatVertexColor = vec4(0.0, 0.0, 1.0, 1.0); // 蓝色}
}

在这个例子中,我们将根据顶点的位置信息决定输出的颜色。当使用平面着色时,即使三角形内部有多个顶点,最终渲染出来的颜色将是引发顶点(在这种情况下,默认是最后一个顶点)的颜色。

如果我们在OpenGL代码中设置ProvokingVertexLAST_VERTEX_CONVENTION,那么在光栅化阶段,三角形的每个像素都将采用其最后一个顶点计算出的flatVertexColor值。

// 设置引发顶点模式为默认值:LAST_VERTEX_CONVENTION
glProvokingVertex(GL_LAST_VERTEX_CONVENTION);// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

这样一来,对于由三个顶点构成的三角形来说,不论内部插值如何,整个三角形都会呈现为引发顶点所对应的颜色。

http://www.lryc.cn/news/300546.html

相关文章:

  • 实验5-6 使用函数判断完全平方数
  • AI 或许真的能助力中产阶级重塑辉煌 [译]
  • C#利用接口实现选择不同的语种
  • 设计模式-适配器模式 Adapter
  • 算法训练day29Leetcode491递增子序列46全排列47全排列Ⅱ
  • 内网穿透与搭建私人服务器
  • 交大论文下载器
  • 全栈笔记_浏览器扩展篇(manifest.json文件介绍)
  • 蓝桥杯每日一题(python)
  • 【Vue】工程化开发脚手架Vue CLI
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)
  • LeetCode “AddressSanitizer:heat-use-after-free on address“问题解决方法
  • 幸运彩票
  • 搭建yum仓库服务器
  • 贪心算法练习day1
  • [VulnHub靶机渗透] WestWild 1.1
  • 如何使用 ControlValueAccessor 在 Angular 中创建自定义表单控件
  • 视频讲解:优化柱状图
  • OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区
  • Solidworks:平面草图练习
  • React18原理: 渲染与更新时的重点关注事项
  • 嵌入式I2C 信号线为何加上拉电阻(图文并茂)
  • Vite 5.0 正式发布
  • 嵌入式STM32 单片机 GPIO 的工作原理详解
  • 系统调用的概念
  • 【无标题】Matlab 之axes函数——创建笛卡尔坐标区
  • 2.12:C语言测试题
  • 【Linux】yum软件包管理器
  • 「优选算法刷题」:寻找旋转排序数组中的最小值
  • MySQL 基础入门指南:从安装到基本操作