纹理
可将纹理简单理解一张图片。用来修改由光栅化产生的片元颜色的图像。将纹理贴到图元的过程,称为纹理映射。
纹素:纹理元素,纹素从纹理内存中获得,表示的是将纹理贴到相应片元上的颜色。也就是说,纹素可简单理解为一个颜色值,根据使用环境的不同,其值(RGB情况下)有可能是(0-1)或者(0-255)。
纹理单元:可简单理解为纹理的索引,一个纹理单元与一个纹理图像相互对应绑定,控制着该纹理图像的处理步骤,一个纹理单元在一个纹理通道中维护纹理的各种状态,如:滤波、环绕方式、环境、纹理坐标等。在Mipmap中,多重纹理包含一组连续的纹理单元。Mipmap在opengl或者osg中显示时,类似于数据金字塔,即:当可视化对象距离视角越近,图像像素越高,看到的图像也就越清晰,当距离视角较远时,像素质量降低。
纹理采样器:在着色器中,用来从纹理采样的一种变量。
关系:纹理单元的主要目的是让我们在着色器中可以使用多于一个的纹理。通过把纹理单元赋值给采样器,我们可以一次绑定多个纹理,只要我们首先激活对应的纹理单元。
通过关联一个采样器变量和一个纹理单元,使用GLSL的内置函数(texrure)从纹理图像中提取纹素(颜色值)
,类似将纹理对象绑定到纹理单元,将采样器对象绑定到采样器单元。采样器变量和纹理结合是通过纹理单元来相互对应的。
创建和初始化纹理对象后,在应用程序中可以通过着色器来访问纹理(图像)中的数据。着色器中的纹理用纹理采样器
表示。将纹理绑定到纹理单元,采样器对象绑定到采样器单元(应用成程序中是通过纹理单元连接在一起的),他们一起用来从纹理图像中提取数据,称为采样,采样通过GLSL的内置函数texture
及其多种重载函数来执行。
一个简单的片段(也称片元)着色器:
#version 330 core
uniform sampler2D tex;
in vec2 vs;
layout(location =0) out vec4 color;
void main()
{
color=texture(tex,vs);
}
只单纯看该片元着色器,声明了一个uniform
变量的均匀采样器tex
,该段着色器的输入变量(纹理坐标)是相对应顶点着色的同名输出变量vs
,在glsl的主程序中,内置函数texture
依据纹理坐标和采样器提取纹素。
从上述片段着色器中,可以看出texture
函数的返回值是vec4
类型。
看常用的一个texture
的声明:
Gvec4 texture(gsampler2D tex,vec2 P[,float,bias]);
表示用纹理坐标P,从绑定到sampler2D当前纹理中作纹理查找(不考虑阴影及比较操作,bias参数暂时不考虑),texture函数的返回值是一个颜色值,也就说返回的vec4
对象的各个元素值应该在0~1
之间。
缓冲
双缓冲:在可视化设备上展现在我们眼前的图像并不是一下子生成的,而是按照从左到右,从上到下逐像素绘制的,并非瞬间显示。
应用双缓冲渲染窗口程序。前缓冲存储的最终图像,所有的渲染指令放在后缓冲中绘制。当所有渲染指令执行完毕之后,交换前后缓冲,即双缓冲绘制。这样可避免 显示图像闪烁等问题。
Alpha测试与Blend融混
Alpha测试与其他测试(深度、模板等)一样,只是单纯的比较值的大小,如果通过Alpha的测试值,则像素被绘制,否则不被绘制。
opengl中如果一个输入的片元通过了所有的测试,那么它就可以与颜色缓冲中当前的颜色值通过某种方式进行合并,即:将帧缓存当中的已有的颜色值与输入的片元颜色进行混合--这个过程称为融混。 融混通常与Alpha值相关。
opengl中测试顺序是:剪裁测试、Alpha测试、模板测试、深度测试。如果某项测试不通过,则被舍弃,而只有所有测试都通过的情况下才会执行混合操作。
注:所谓裁剪测试,是指在当前视口中指定一个绘制区域(如视口的宽高为800600,但是只在400300的矩形窗口中绘制(以视口左下角为起点)),在该绘制区域之外的图元舍弃,绘制窗口之内的进行下一步的操作。
显而易见:融混操作是最终显示在屏幕之前的最后一个步骤,进行融混后最终颜色才被显示。
在开启Alpha测试的情况下,透明像素无法通过该测试,后续的模板和深度测试也不会被执行。若使用混合,即使透明像素也要经过模板和深度等测试才能显示在屏幕上(虽然是透明的,但依然经过了计算)。
因此,如果所有的像素都是“透明”或“不透明”,没有“半透明”时,应该尽量采用Alpha测试而不是采用混合操作,这样有助于提高计算效率。当需要绘制半透明像素时,才采用混合操作。
https://segmentfault.com/a/11... 渲染顺序。
对opengl渲染管线流程进一步细化;顶点数据-->顶点着色器-->细分着色器-->几何着色器-->图元设置-->剪切-->光栅化-->片元着色器-->测试(Alpha-->模板-->深度)-->融混-->可视化显示
其中,顶点着色器和片段着色器阶段是个人可视化编程必不可少的阶段。
注意:光栅化是一个决定哪些像素被几何图元覆盖的过程,光栅化的结果是像素位置的集合和片段的集合(光栅化产生的结果是片元,因为光栅化的后一个阶段就是片元着色器阶段,片元着色器的主要作用就是将纹理像素贴到片元上,可见,光栅化的结果--片元,是一个“候选像素”,也就是准备着色的地方)。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。比如:一个有三个顶点组成的三角形可以占据整个屏幕,但是却需要上百万个片段。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。