可视化编程中的几个基础概念及我的理解

纹理

可将纹理简单理解一张图片。用来修改由光栅化产生的片元颜色的图像。将纹理贴到图元的过程,称为纹理映射。
纹素:纹理元素,纹素从纹理内存中得到,表示的是将纹理贴到相应片元上的颜色。也就是说,纹素可简单理解为一个颜色值,根据使用环境的不一样,其值(RGB状况下)有多是(0-1)或者(0-255)。
纹理单元:可简单理解为纹理的索引,一个纹理单元与一个纹理图像相互对应绑定,控制着该纹理图像的处理步骤,一个纹理单元在一个纹理通道中维护纹理的各类状态,如:滤波、环绕方式、环境、纹理坐标等。在Mipmap中,多重纹理包含一组连续的纹理单元。Mipmap在opengl或者osg中显示时,相似于数据金字塔,即:当可视化对象距离视角越近,图像像素越高,看到的图像也就越清晰,当距离视角较远时,像素质量下降。
纹理采样器:在着色器中,用来从纹理采样的一种变量。编程

关系:纹理单元的主要目的是让咱们在着色器中可使用多于一个的纹理。经过把纹理单元赋值给采样器,咱们能够一次绑定多个纹理,只要咱们首先激活对应的纹理单元。segmentfault

经过关联一个采样器变量和一个纹理单元,使用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之间。code

缓冲

双缓冲:在可视化设备上展示在咱们眼前的图像并非一会儿生成的,而是按照从左到右,从上到下逐像素绘制的,并不是瞬间显示。
应用双缓冲渲染窗口程序。前缓冲存储的最终图像,全部的渲染指令放在后缓冲中绘制。当全部渲染指令执行完毕以后,交换先后缓冲,即双缓冲绘制。这样可避免 显示图像闪烁等问题。orm

Alpha测试与Blend融混

Alpha测试与其余测试(深度、模板等)同样,只是单纯的比较值的大小,若是经过Alpha的测试值,则像素被绘制,不然不被绘制。
opengl中若是一个输入的片元经过了全部的测试,那么它就能够与颜色缓冲中当前的颜色值经过某种方式进行合并,即:将帧缓存当中的已有的颜色值与输入的片元颜色进行混合--这个过程称为融混。 融混一般与Alpha值相关。对象

opengl中测试顺序是:剪裁测试、Alpha测试、模板测试、深度测试。若是某项测试不经过,则被舍弃,而只有全部测试都经过的状况下才会执行混合操做。
:所谓裁剪测试,是指在当前视口中指定一个绘制区域(如视口的宽高为800600,可是只在400300的矩形窗口中绘制(以视口左下角为起点)),在该绘制区域以外的图元舍弃,绘制窗口以内的进行下一步的操做。索引

显而易见:融混操做是最终显示在屏幕以前的最后一个步骤,进行融混后最终颜色才被显示。
在开启Alpha测试的状况下,透明像素没法经过该测试,后续的模板和深度测试也不会被执行。若使用混合,即便透明像素也要通过模板和深度等测试才能显示在屏幕上(虽然是透明的,但依然通过了计算)。图片

所以,若是全部的像素都是“透明”或“不透明”,没有“半透明”时,应该尽可能采用Alpha测试而不是采用混合操做,这样有助于提升计算效率。当须要绘制半透明像素时,才采用混合操做。
https://segmentfault.com/a/11... 渲染顺序。

对opengl渲染管线流程进一步细化;
顶点数据-->顶点着色器-->细分着色器-->几何着色器-->图元设置-->剪切-->光栅化-->片元着色器-->测试(Alpha-->模板-->深度)-->融混-->可视化显示
其中,顶点着色器和片断着色器阶段是我的可视化编程必不可少的阶段。
注意:光栅化是一个决定哪些像素被几何图元覆盖的过程,光栅化的结果是像素位置的集合和片断的集合(光栅化产生的结果是片元,由于光栅化的后一个阶段就是片元着色器阶段,片元着色器的主要做用就是将纹理像素贴到片元上,可见,光栅化的结果--片元,是一个“候选像素”,也就是准备着色的地方)。当光栅化后,一个图元拥有的顶点数目和产生的片断之间没有任何关系。好比:一个有三个顶点组成的三角形能够占据整个屏幕,可是却须要上百万个片断。

相关文章
相关标签/搜索