新网站建设问卷,wordpress收录p,wordpress视频 小程序,现代建设中国公司网站早期各片段测试 Early Per-Fragment Tests
layout(early_fragment_tests) in;
如果片段着色器指定了 Early_fragment_tests 布局限定符#xff0c;则将在片段着色器执行之前执行本节中描述的每个片段测试。 否则#xff0c;它们将在片段着色器执行后执行。在光栅化阶段生成片…早期各片段测试 Early Per-Fragment Tests
layout(early_fragment_tests) in;
如果片段着色器指定了 Early_fragment_tests 布局限定符则将在片段着色器执行之前执行本节中描述的每个片段测试。 否则它们将在片段着色器执行后执行。在光栅化阶段生成片段之后会在片段着色器执行之前对每个片段进行一系列的每片段操作。如果在这些操作中的任何一处片段被丢弃则该片段将不会被后续任何阶段处理包括片段着色器的执行。
按照以下顺序对每个片段执行三个基本的片段操作以及可选的另外三个操作
像素所有权测试确定当前片段是否属于当前视口范围内的有效像素。剪裁测试检查片段是否位于剪裁区域内即窗口坐标系下的可见区域。多采样片段操作当启用多重采样时会处理每个片段对应的所有样本点并根据它们的结果来决定最终片段的颜色和深度值。
若启用了早期每片段操作还会进行以下测试
模板测试根据模板缓冲区的内容判断片段是否应该被绘制或剔除。深度缓冲测试对比片段的深度值与深度缓冲区中的现有值以确定片段是否遮挡了已有的片段或者应该被遮挡。遮挡查询样本计数在进行性能分析或优化时用于统计通过所有测试并可能影响屏幕输出的片段数量。
像素所有权测试 Pixel Ownership Test
第一个测试是确定帧缓冲中位置xwyw处的像素当前是否由GL更准确地说由此GL上下文所拥有。如果不是则窗口系统决定了传入片段的命运。可能的结果是丢弃片段或者将一些后续逐片段操作应用于片段的某个子集。此测试允许窗口系统控制GL的行为例如当GL窗口被遮挡时。
如果绘制帧缓冲是帧缓冲对象参见第17.4.1节则像素所有权测试始终通过因为帧缓冲对象的像素由GL拥有而不是窗口系统。如果绘制帧缓冲是默认帧缓冲则窗口系统控制像素所有权。
剪裁测试 Scissor Test
剪切测试Scissor Test是一种图形渲染过程中的功能它用于判断像素坐标(xw, yw)是否位于每个视口所定义的剪切矩形区域内。在OpenGL等图形API中通过设置剪切矩形可以限制帧缓冲区中某个指定区域进行绘制或清除操作。
具体来说剪切矩形由四个值确定左边界left、下边界bottom、宽度width和高度height。这些值可以通过调用相应的API函数如glScissor()来设置并且针对每个视口都可以独立定义一个剪切矩形。
当光栅化过程中产生的片段fragment的窗口坐标xw, yw满足以下条件时该片段通过剪切测试
左边界小于等于xw并且xw小于左边界加上宽度即 left ≤ xw left width下边界小于等于yw并且yw小于下边界加上高度即 bottom ≤ yw bottom height
若片段坐标不在剪切矩形范围内则该片段将被丢弃不会进行后续的绘制操作。这对于限制渲染到屏幕特定区域、优化性能以及实现一些特殊效果非常有用。
void glScissorArrayv( uint first, sizei count, const int *v );
void glScissorIndexed( uint index, int left, int bottom, sizei width, sizei height );
void glScissorIndexedv( uint index, int *v );
void glScissor( int left, int bottom, sizei width, sizei height );glEnable(GL_SCISSOR_TEST);
glDisable(GL_SCISSOR_TEST);void glEnablei( enum target, uint index );
void glDisablei( enum target, uint index );
boolean glIsEnabledi( enum target, uint index );设置一组裁剪矩形每个矩形应用于相应的视口
void glScissorArrayv( uint first, sizei count, const int *v );first要修改的第一个裁剪矩形的索引。count裁剪矩形的数量。v一个整数数组的地址依次包含裁剪矩形的左边、底部、宽度和高度。
int scissors[8] { 0, 0, 300, 200, // 视口 0 的 左下宽高350, 50, 200, 200 // 视口 1 的 左下宽高
};
glScissorArrayv(0, 2, scissors); // 使用ScissorArrayv设置剪切矩形
glEnable(GL_SCISSOR_TEST); // 确保剪切测试已启用// 对于第一个视口其剪切矩形范围是[ 0, 0]到[300, 200]
// 对于第二个视口其剪切矩形范围是[350, 50]到[550, 250]。void glScissorIndexed( uint index, int left, int bottom, sizei width, sizei height );// 等价于int v[] { lef t, bottom, width, height };
glScissorArrayv(index, 1, v);void glScissor( int left, int bottom, sizei width, sizei height );// 等价于for (uint i 0; i MAX_VIEWPORTS; i) {glScissorIndexed(i, left, bottom, width, height);
}void glScissorIndexedv( uint index, int *v );// 等价于glScissorArrayv(index, 1, v);// 启用或禁用所有视口的剪切测试
glEnable(GL_SCISSOR_TEST);
glDisable(GL_SCISSOR_TEST);// 针对单个视口独立启用或禁用剪切测试
glEnablei(GL_SCISSOR_TEST, viewportIndex); // 启用指定视口的剪切测试
glDisablei(GL_SCISSOR_TEST, viewportIndex); // 禁用指定视口的剪切测试// 查询特定视口的剪切测试状态
GLboolean isEnabled glIsEnabledi(GL_SCISSOR_TEST, viewportIndex);// 如果要查询默认视口即索引为0的视口的剪切测试状态
GLboolean isEnabledDefaultViewport glIsEnabled(GL_SCISSOR_TEST);多采样片段操作 Multisample Fragment Operations
在OpenGL或其他类似的图形渲染管线中片段覆盖fragment coverage的修改步骤是一个关键阶段它涉及到多个状态变量包括SAMPLE_COVERAGE、SAMPLE_COVERAGE_VALUE、SAMPLE_COVERAGE_INVERT、SAMPLE_MASK和SAMPLE_MASK_VALUE。这一过程发生在多采样MULTISAMPLE功能启用且SAMPLE_BUFFERS值为1的情况下。
首先片段着色器输出的alpha值仅针对颜色编号0、索引0的组件并且若着色器未写入该alpha值则其为未定义。
样本覆盖率相关的操作可以通过Enable和Disable函数控制对应的目标分别为SAMPLE_COVERAGE和SAMPLE_MASK。当SAMPLE_COVERAGE启用时会根据SAMPLE_COVERAGE_VALUE生成一个临时覆盖掩码并与当前片段覆盖进行逻辑AND运算。如果SAMPLE_COVERAGE_INVERT设为TRUE还会先对这个临时掩码进行反转操作。
进一步如果SAMPLE_MASK也被启用片段覆盖还需与SAMPLE_MASK_VALUE做AND运算以更新最终的片段覆盖值。
SAMPLE_COVERAGE_VALUE和是否反转的设置通过SampleCoverage函数完成其中value参数代表覆盖率数值invert参数指示是否翻转掩码。而SAMPLE_MASK_VALUE则由SampleMaski函数设定该函数允许指定特定掩码字中的位掩码。
这些值的转换算法不强制具体实现方式但通常期望保证一定比例关系和伪随机性以避免图像出现因采样位置规律性导致的瑕疵。查询上述状态变量的具体值可以使用相应的查询函数。
void glSampleCoverage( float value, boolean invert );value参数是样本覆盖率的数值SAMPLE_COVERAGE_VALUE。它被限制在区间 [0, 1] 内表示覆盖的样本比例。如果所有的样本都覆盖value应为1.0如果没有样本覆盖value应为0.0。invert参数是否反转样本覆盖率SAMPLE_COVERAGE_INVERT。如果设置为true则覆盖率会被反转。
void glSampleMaski( uint maskNumber, bitfield mask );maskNumber表示要修改的掩码编号因为在OpenGL 4.2及更高版本中可以针对不同的视口或者同一视口中不同的掩码单元进行独立设置。 mask这是一个位域值每一位对应于一个子样本如果该位为1则相应的子样本会被启用如果为0则对应的子样本被禁用。掩码长度应与当前激活帧缓冲区的样本数量相匹配。
早期片段测试限定符 The Early Fragment Test Qualifier
在OpenGL等图形渲染管线中模板测试stencil test、深度缓冲区测试depth buffer test和遮挡查询样本计数occlusion query sample counting的操作执行时机取决于当前激活的片段着色器是否启用了早期片段测试功能参见第15.2.4节。当开启早期每个片段操作时这些测试将在片段着色器执行前进行并根据测试结果相应地更新模板缓冲区、深度缓冲区的内容以及遮挡查询的样本计数。一旦片段着色器执行完毕后将不再重复执行这些操作。
如果当前没有活动程序或者活动程序中没有片段着色器或者程序链接时关闭了早期片段测试那么这些操作会在片段着色器执行之后按第17.3节描述的顺序执行。
另外如果开启了早期片段测试片段着色器计算出的深度值将不会对最终深度判断产生影响。同时要注意的是即使片段或样本由于后期片段操作例如alpha-to-coverage测试导致被丢弃它们仍然可能会更新模板缓冲区、深度缓冲区的数据以及遮挡查询的样本计数。这意味着在决定是否绘制某个像素之前可能会先完成某些相关的缓冲区更新和统计计算。