Open GL es 学习(一)

来源:互联网 发布:快走丝编程用什么软件 编辑:程序博客网 时间:2024/05/17 01:06


环境
     Android Studio
     使用JAVA 学习 OpenGLES 

参考书籍 
《OpenGL es 2.0 上卷》

大二下学期的时候,因为计算机图形学这门课,短暂接触了OpenGL,但是使用的都是一些简单的API,如 GLBegin,GLEnd,GLVertex等方法去进行绘图,在接触 Open GL ES 2.0 后,发现原本的GLBegin,GLEnd的 绘图方式已经被弃用了,新的绘图方式将在 着色器中进行 也就是Shader.
先上一张 OpenGL ES 2.0的渲染管线~~,注意,VertexShader FragmentShader, 简单的来说,VertexShader(顶点着色器) 应当顶点输出最后映射在屏幕上的坐标!! FragmentShader (片元着色器)则负责对每个片元进行着色,也就是说负责输出颜色

                                           

以上是OpenGL ES2.0中最重要的概念,因为我们将不再采取GLBegin GLEnd的方法绘图~~,而是通过把顶点的数据,传入VertexShader,将颜色数据传入 FragmentShader 来进行绘图。


uniform mat4 uMvpMatrix;
attribute vec3 aVertextPos;
attribute vec4 aColor;
varying vec4 vColor;
 
void main()
{
gl_Position = uMvpMatrix * vec4( aVertextPos,1); // 4维,是因为齐次坐标
vColor = aColor;
}

先来看一份普遍的 vertexShader ,   gl_Position 是 内置变量,意思是 该变量 即是 该顶点最后输出在 屏幕的位置,基本每个 顶点着色器,我们都可以看到

gl_Position = uMvpMatrix * vec4( aVertextPos,1);
Mvp矩阵 (同样是程序中传进来)右乘  aVertexPos (是从 程序中传来的顶点 ) 

大家都知道MVP 即是 总变换矩阵,为什么呀?

想想,在进行 绘图之前我们都要做些什么,
1.初始化 变换矩阵,进行一些列的 平移变换,缩放,旋转
2.设置摄像机的位置
3.设置投影的参数(正交投影?,透视投影?)

在这里就涉及了3个空间坐标,1 世界空间坐标 2.观察空间坐标 3.投影空间坐标
很容易理解,在输入顶点数据的时候,我们给了一些列的顶点坐标,但是这些顶点的坐标最后都不是显示在屏幕上的坐标。。
而MVP矩阵,则是记录了 所有变换的矩阵。。。

也就是说,我们一般会记录 3个矩阵, 

模型矩阵(Model) 是专门用来进行平移,缩放,旋转的。
观察矩阵(View)是专门用来进行设置摄像机的参数的
投影矩阵(Projection) 是专门用来进行 设置投影参数的

所以每个输出的顶点最后 都要与MVP矩阵相乘。


接下来看看片元着色器
precision mediump float;
varying vec4 vColor;
void main()
{
gl_FragColor = vColor;
}

varyring 是从顶点着色器 中传过来的颜色参数, gl_FragColor 是片元着色器的内置变量,意思是最后该片元的输出颜色

需要注意的有3点
1.一个片元,并不完全等于一个像素~~但有时候却可以这么理解。。
2.片元着色器是每个片元执行一次~,那顶点着色器自然就是每顶点执行一次啦
3.因为顶点的数量一般都是小于片元的,所以从顶点着色器传过来的颜色值,是经过了插值计算后的颜色值~~

~在了解完上述的知识点后,很明显,我们只需要将 数据从程序中传入 着色器的代码中,既可以完成绘图。




  本人之前一直学习Unity3D,最近开始学习OpenGL ES,希望可以理解更多没接触过的领域。。。写的不好的地方,请多多指教
0 0