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);

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

相关推荐
Padid2 天前
Unity SRP学习笔记(二)
笔记·学习·unity·游戏引擎·图形渲染·着色器
refineiks8 天前
three.js绘制宽度大于1的线,并动态新增顶点
3d·图形渲染·webgl
Winston Wood11 天前
一个简单的例子,说明Matrix类的妙用
android·前端·图像处理·图形渲染
森龙安11 天前
VulkanTutorial(8·Shader modules)
图形渲染
云渲染图科普匠13 天前
3d室内设计效果图渲染平台哪个好?瑞云快图怎么样?
3d·图形渲染·3dsmax
先知demons14 天前
antvG6如何实现节点动画、连线动画、切换节点图标
前端·javascript·vue.js·图形渲染·canva可画
3DCAT实时渲染云15 天前
边缘计算技术的优势与挑战
实时互动·边缘计算·图形渲染
大耳猫18 天前
Android OpenGL天空盒
android·kotlin·android studio·图形渲染
大耳猫20 天前
Android OpenGL触控反馈
android·kotlin·android studio·图形渲染
木市门20 天前
【GAMES101笔记速查——Lecture 16 Ray Tracing4】
图像处理·笔记·图形渲染