OpenGL基础

一:OpenGL和OpenGL ES简介

 1.OpenGL:全称是(Open Graphics Library)一个开放的图形库,提供了跨平台,跨语言的图形程序接口。

 2.OpenGL应用领域:视频、图像、图片处理;2D/3D游戏引擎开发;科学可视化;医学软件的开发;CAD(计算机辅助技术);虚拟实境(AR VR);人工智能等等

 3.OpenGL ES:(OpenGL for Embedded Systems)是OpenGL的子集,专为手机、PAD和游戏主机等嵌入式设备设计的,是一个在移动平台上能够支持OpenGL最基本功能的精简规范。

 4.使用OpenGL ES的原因

    OpenGL基础_第1张图片

      GPU(Graphics Processing Unit)图形处理器,显卡处理器,它是显卡的“心脏”,专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染必须的。

       因为CPU和GPU不能直接通信,会导致数据饥饿的问题,为了解决这个问题,运用到了OpenGL ES,实际上是开辟了一块儿缓冲区,可以直接把数据放到这个缓冲区,不需要数据传递,解决数据饥饿的问题。


二:着色器语言

(一  基本名词解释)

  1.图元:图形软件包中描述图形元素的函数,即组成图像的基本单元。

  2.OpenGL渲染管线

   渲染流水线:显示芯片内部处理图形信号互相独立的并行处理单元!其实就是一系列有序的处理阶段的序列,用于把应用中的数据转化到OpenGL生成一个最终的图像的过程。

  3.GLSL

     GLSL(GL Shading Language)GL着色器语言,专门为图形开发设计的编程语言。

  4.可编程管线的编程阶段

  OpenGL基础_第2张图片

      光栅化:将输入图元的数学描述转换为与屏幕位置对应的像素片元(其实就是把矢量图形转成像素点的过程)如下图:把圆形转成像素点的过程就是光栅化。

       OpenGL基础_第3张图片

 5.GLSL基本语法

  1.注释:单行注释“//”,多行注释“/*        */”

  2.main函数没有返回值

  3.每条语句后都有分号;


(二 GLSL变量)

   变量命名规范:

       1.变量名可包括,数字、字母、下划线、但数字的和字母不能作为变量名的开头

       2.变量名不能包含两个连续的下划线

       3.系统变量名以“gl”开头,所以自己命名的变量不能以“gl”开头

       4.见名知意,多个单词组合,第一个单词首字母小写,其他单词首字母大写


  1.标量:有大小,无方向

      float  a;

      int b;

      bool c;

  初始化: float d=1.0f;   //浮点数必须包括小数点".",末尾要加上"f"


  2.向量:有大小,有方向

     在着色器中的作用:存储颜色值,位置,纹理坐标

    它可以看做是同样类型的标量组成,基本类型分为bool,int,float三种,每个向量可以由2个,3个,4个相同的标量组成

    

 基本类型 2D向量 3D向量 4D向量
float vec2(包含两个浮点数的向量) vec3 vec4
int ivec2 ivec3 ivec4
bool bvec2 bvec3 bvec4

 a)  vec3 xyz=vec3(0.1,0.2,0.3);

   vec4 rgba=vec4(0.1,0.2,0.3,0.4)

 b) 向量加长

   vec3 xyz=vec3(0.1,0.2,0.3);

   vec4 rgba=vec4(xyz,0.4);

 c) 向量取短

   vec4 rgba=vec4(0.1,0.2,0.3,0.4)

   vec3 xyz=rgba.rgb;或者 vec3 xyz=rgba.xyz;

   vec3 xyz=vec3(1.0);和vec3 xyz=vec3(1.0,1.0,1.0)是一个意思

  3.矩阵

     在3D开发中的作用:做位移变换

基本类型 矩阵类型 矩阵类型 矩阵类型
float mat2 mat3(3*3的矩阵) mat4

     mat4*4 第一个值表示列数,第二个值表示行数

     mat3 m=mat3(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)

      vec3 v1=vec3(1.0,2.0,3.0);

      vec3 v2=vec3(4.0,5.0,6.0);

      vec3 v3=vec3(7.0,8.0,9.0);

      mat3 m=mat3(v1,v2,v3);


      vec3 v4=(10.0,11.0,12.0);

      mat4 m1=mat4(v1,1.0,v2,2.0,v3.3.0,v4,4.0);

   分量:向量和矩阵都属于分量

  4.采样器:

    sampler2D 访问二维贴图

    sampler3D 访问三维贴图

    samplerCube 访问立方贴图

  5.结构体:一组由相同类型或不同类型数据组成的集合;

  6.数组:一组相同类型数据组成的集合

    a) GLSL支持任意类型数组,包括结构体

    b) 数组索引从0开始(不能为负,不能超范围)

    c)数组可以定义大小,或者没有大小

        float f[5];

        float a;  //未定义维数,可以重新声明

     d)数组属于GLSL中的第一类型

           数组在GLSL中有构造函数,可以作为函数参数和返回值

           可静态初始化一个数组的值

            float f[5]=float[5](1.0,2.0,3.0,4.0,5.0)

     f)多维数组:float   f[2][3];

    7.类型修饰符

      (1) attribute  顶点属性,只能表示顶点着色器中的属性

      (2) Unifrom  一致变量,从宿主语言中通过OpenGL给GLSL传值

      (3) Varying 易变变量,在顶点着色器和片元着色器中传值,实际上经过了一个光栅化的过程。顶点着色器和片元着色器的名字要一致

      (4)const 常量,编译时不需要分配任何运行时资源

      (5)in/out 输入/输出变量 

      (6)inout 即可输入也可输出

      (7)discard 关键字 丢弃当前片元,终止片元着色器进行(只在片元着色器中使用)


GLSL的操作符及优先级

    OpenGL基础_第4张图片

 程序基本结构的案例:

 uinfrom mat4 uMVPMatrix;   

 attruibte vec3 aPosition;  //定义顶点的位置

 attruibte vec2 aTexCoor;  //定义纹理

 varying vec2 vTextureCoord;

   void positionShift(){

     gl_Position = uMVPMatrix * vec4(aPosition,1);   //计算结果传给内建变量gl_Postion

   } 

void main(){ 

   positionShift();

   vTextureCoord = aTexCoor;

  }




2D向量

你可能感兴趣的:(OpenGL基础)