资讯专栏INFORMATION COLUMN

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

lk20150415 / 934人阅读

摘要:纹素纹理元素,纹素从纹理内存中获得,表示的是将纹理贴到相应片元上的颜色。创建和初始化纹理对象后,在应用程序中可以通过着色器来访问纹理图像中的数据。着色器中的纹理用纹理采样器表示。

纹理

可将纹理简单理解一张图片。用来修改由光栅化产生的片元颜色的图像。将纹理贴到图元的过程,称为纹理映射。
纹素:纹理元素,纹素从纹理内存中获得,表示的是将纹理贴到相应片元上的颜色。也就是说,纹素可简单理解为一个颜色值,根据使用环境的不同,其值(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-->模板-->深度)-->融混-->可视化显示
其中,顶点着色器和片段着色器阶段是个人可视化编程必不可少的阶段。
注意:光栅化是一个决定哪些像素被几何图元覆盖的过程,光栅化的结果是像素位置的集合和片段的集合(光栅化产生的结果是片元,因为光栅化的后一个阶段就是片元着色器阶段,片元着色器的主要作用就是将纹理像素贴到片元上,可见,光栅化的结果--片元,是一个“候选像素”,也就是准备着色的地方)。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。比如:一个有三个顶点组成的三角形可以占据整个屏幕,但是却需要上百万个片段。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61142.html

相关文章

  • Python类、模块、包的念及区别

    摘要:类类的概念在许多语言中出现,是面向对象编程的基础,很容易理解。抽象出不同物体的共同特征,根据相似性原则,把彼此相似的物体归于相同的类概念,它将数据和操作进行封装,以便将来的复用。模块名就是文件名去掉后缀。包目录下为首的一个文件便是。 类 类的概念在许多语言中出现,是面向对象编程的基础,很容易理解。抽象出不同物体的共同特征,根据相似性原则,把彼此相似的物体归于相同的类概念, 它将数据和操...

    explorer_ddf 评论0 收藏0
  • 深入理解 Laravel Eloquent(一)——基本念及用法

    摘要:原文发表在我的个人网站深入理解一基本概念及用法在本系列文章中,我将跟大家一起学习的基本用法,探索的各种高级功能,理解背后的运行原理,并最终达到深入理解灵活使用的目的。下一步深入理解二中间操作流 原文发表在我的个人网站:深入理解 Laravel Eloquent(一)——基本概念及用法 在本系列文章中,我将跟大家一起学习 Eloquent 的基本用法,探索 Eloquent 的各种...

    Edison 评论0 收藏0
  • Python:Tornado 第三章:HTML5 WebSocket念及应用:第三节:客户端编程

    摘要:上一篇文章第三章概念及应用第二节服务端编程下一篇文章第四章网站部署第一节调试模式由于是的标准之一,所以主流浏览器的客户端编程语音已经支持的客户端编程。此事件发生在收到了来自服务器的消息时。此事件发生在通信过程中有任何错误时。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及应用:第二节:服务端编程下一篇文章:Python:Tornado 第四章:T...

    miguel.jiang 评论0 收藏0
  • Python:Tornado 第三章:HTML5 WebSocket念及应用:第二节:服务端编程

    摘要:上一篇文章第三章概念及应用第一节概念下一篇文章第三章概念及应用第三节客户端编程定义了类用于处理链接的请求,应用开发者应该继承该类并实现其中的函数。通常,这是服务器端编程的核心函数,通过解析收到的消息做出相应的处理。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及应用:第一节:WebSocket概念下一篇文章: Python:Tornado 第三章...

    xfee 评论0 收藏0
  • 慕课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<