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

浏览: 179 发布日期: 2017-09-05 分类: visual-studio

纹理

可将纹理简单理解一张图片。用来修改由光栅化产生的片元颜色的图像。将纹理贴到图元的过程,称为纹理映射。
纹素:纹理元素,纹素从纹理内存中获得,表示的是将纹理贴到相应片元上的颜色。也就是说,纹素可简单理解为一个颜色值,根据使用环境的不同,其值(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测试、模板测试、深度测试。如果某项测试不通过,则被舍弃,而只有所有测试都通过的情况下才会执行混合操作。

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

因此,如果所有的像素都是“透明”或“不透明”,没有“半透明”时,应该尽量采用Alpha测试而不是采用混合操作,这样有助于提高计算效率。当需要绘制半透明像素时,才采用混合操作。
https://segmentfault.com/a/11... 渲染顺序。

对opengl渲染管线流程进一步细化;
顶点数据-->顶点着色器-->细分着色器-->几何着色器-->图元设置-->剪切-->光栅化-->片元着色器-->测试(Alpha-->模板-->深度)-->融混-->可视化显示
其中,顶点着色器和片段着色器阶段是个人可视化编程必不可少的阶段。
注意:光栅化是一个决定哪些像素被几何图元覆盖的过程,光栅化的结果是像素位置的集合和片段的集合。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。比如:一个有三个顶点组成的三角形可以占据整个屏幕,但是却需要上百万个片段。

返回顶部