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

平面着色 Flatshading

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

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

cpp 复制代码
void glProvokingVertex(enum provokeMode);

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

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

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

glsl 复制代码
out flat vec4 flatColor;

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

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

glsl 复制代码
#version 330 core

in 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值。

cpp 复制代码
// 设置引发顶点模式为默认值:LAST_VERTEX_CONVENTION
glProvokingVertex(GL_LAST_VERTEX_CONVENTION);

// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

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

相关推荐
RReality1 天前
【Unity Shader URP】模板遮罩 / 传送门 实战教程
ui·unity·游戏引擎·图形渲染·材质
charlie1145141912 天前
通用GUI编程技术——图形渲染实战(三十七)——D3D11初始化与SwapChain:从零搭建GPU渲染框架
开发语言·c++·3d·图形渲染
charlie1145141912 天前
通用GUI编程技术——图形渲染实战(三十六)——Constant Buffer与数据传递:CPU-GPU通信通道
开发语言·c++·windows·c·图形渲染·win32
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 06:相机视图矩阵的由来
c++·线性代数·unity·矩阵·godot·图形渲染·unreal engine
Highcharts.js3 天前
可视化图表代码学习|如何绘制一条正弦波
信息可视化·图形渲染·highcharts
RReality4 天前
【Unity Shader URP】屏幕空间扭曲后处理(Screen Space Distortion)实战教程
ui·unity·游戏引擎·图形渲染·材质
XX風5 天前
ScopedValue 泛型模板类和 ScopedglDepthMask的 RAII 实现
图形渲染
平行云6 天前
虚拟直播混合式2D/3D应用程序实时云渲染推流解决方案
linux·unity·云原生·ue5·图形渲染·实时云渲染·像素流送
RReality8 天前
【Unity Shader URP】平面反射(Planar Reflection)实战教程
ui·平面·unity·游戏引擎·图形渲染·材质
RReality9 天前
【Unity UGUI】Toggle / ToggleGroup 与 Dropdown
ui·unity·游戏引擎·图形渲染·材质