opengl

来源:互联网 发布:手机淘宝怎么寄快递 编辑:程序博客网 时间:2024/06/05 11:02


openGL ES 3.0 图像管道示意图:

Vertex shader的输入可以是:

Shader program、Vertex shader 、Uniforms、Vertex shader inputs(or attributes)、Uniforms、Samples

Vertex Shader计算出的结果交给Fragment Shader(片段着色器)处理

Vertex shaders 可以利用矩阵进行位置转换,通过光照方程预测顶点颜色,或者产生和转换纹理坐标,其输入输出如下:


下面展示了一个顶点着色器例程。

#version 300 esuniform mat4 u_mvpMatrix;in vec4 a_position;in vec4 a_color;out vec4 v_color;void main(){v_color = a_color;gl_Position = u_mvpMatrix * a_position;}
第一行展示着色器语言版本,u_mvpMatrix是一个uniform,其中存储了模型视图和程序矩阵。

以in标识的是着色器的输入变量,以out标识的是程序的输出变量,内建变量gl_position是自动声明的,位置转换的结果必须要交给它。

main()函数中的是着色器运算过程

primitive assembly(基元装配)

vertex shader之后的流程就到了primitive assembly(基元装配),基元是一些几何对象,比如三角形、线段或者点块纹理。基元的每个顶点都会分配一份不同的拷贝给vertexshader,装配的时候在组装成基元。每个基元都需要判定是否在视锥内.如果基元不完全在视锥内,那么可能就需要裁剪(如果完全在视锥外就可以丢弃),裁剪后,顶点位置转换到屏幕坐标。这之后就进入到rasterization stage 光栅化阶段

rasterization stage 光栅化阶段



当适当的基元被构建之后,就需要将基元转换后续将交由fragment shader(片段着色器)来进行处理的二维的片段,这就是光栅化。二维片呈现了可以被展现到屏幕上的像素。

如图Figure 1-3,这阶段通过各种光栅化过程处理诸如颜色,纹理坐标这些属性。

光栅化之后就到了Fragment shader阶段了。

Fragment Shader(片段着色器)

片段着色器实现的是一些操作光栅化后片段的通用处理流程。



片段着色器的输入可以是Shader program、Input variables、uniforms、Samples

片段着色器可以丢弃片段或者产生一个或多个相关的颜色值作为输出。特殊情况是片段着色器的输出只是一个单独的颜色值,除非要渲染的是一个多重渲染目标(multiple render targets)。


以下例程和顶点着色器一样,展示了Fragment shader的写法,包括,输入输出和处理过程

#version 300 esprecision mediump float;in vec4 v_color;out vec4 fragColor;void main(){fragColor = v_color;}

fragment shader之后就到了Per-Fragment Operations

Per-Fragment Operations(片段预处理阶段)


以屏幕坐标光栅化生产的片段只能在framebuffer中根据屏幕坐标(x,y)来进行修改。而在pre-Fragment operations这一阶段,会进行以下处理:

------------------------------

Pixel ownership test

Scissor test

Stencil and depth tests

Blending

Dithering

-------------------------

Pixel ownership test 检测framebuffer中(x,y)处的像素当前是否被OpenGL ES获得。这一过程允许窗口系统控制framebuffer中的哪些像素归属于当前的OpenGL ES context

比如如果一个正在显示OpenGL ES framebuffer的窗口被另一个窗口遮盖住,窗口系统就会判定遮盖住的像素已经不由OpenGL ES context进行管理,因此,这些像素可能就完全不会被显示。Pixel ownership test这一过程内置于OpenGL ES,不由应用开发者控制。

Scissor test

确定(x,y)是否位于位于作为OpenGL ES state 的矩形范围内,如果位于裁剪区域外,则被抛弃


0 0
原创粉丝点击