绘制单帧时三类着色器调用次数及渲染管线阶段关联问询
着色器各阶段执行次数与阶段间对应关系
顶点着色器(Vertex Shader, VS)
执行次数严格等于输入的顶点总数。
比如你给出的3个顶点(0,1,0)、(1,1,0)、(1,0,0),即便顶点属性包含多个数据(比如同时有位置、法线等共6个vec3变量),VS依然只执行3次——因为它是针对单个顶点执行的,每个顶点对应一次调用,负责处理该顶点的属性转换(如空间坐标变换)。你代码中写的layout (location = 0) in vec3 aPos;就是声明顶点位置属性的输入,不影响VS的执行次数。
几何着色器(Geometry Shader, GS)
执行次数等于输入的图元数量,你的猜测是正确的。
GS的输入是单个图元的完整顶点集合(比如三角形图元就是包含3个顶点的结构体数组),每次执行只处理一个图元。比如你用3个顶点组成1个三角形图元(GL_TRIANGLES绘制模式),GS就执行1次;如果是GL_TRIANGLE_STRIP模式,3个顶点会组成2个三角形图元,GS就执行2次。GS可以输出0个、1个或多个新图元,输出顶点数不受输入限制,但执行次数始终和输入图元数一一对应。
片元着色器(Fragment Shader, FS)
执行次数等于当前绘制图元光栅化后覆盖的像素(采样点)数量,和屏幕总像素数无关。
光栅化阶段会把图元的浮点坐标转换为屏幕上的离散像素位置,计算图元覆盖了哪些像素(包括抗锯齿时的子像素采样点),每个被覆盖的采样点都会触发一次FS执行,用来计算该点的最终颜色。比如你给出的三角形,假设光栅化后覆盖了N个屏幕像素,FS就执行N次;屏幕上未被该三角形覆盖的区域,不会触发对应的FS调用。
内容的提问来源于stack exchange,提问作者Shahashahaha
相关产品推荐
相关产品推荐

