Shader and Program编程基本概念

这篇博客详细介绍了OpenGL ES中的Shader和Program对象的概念,包括创建与编译Shader、链接Program、设置Uniforms和Attributes。讲解了Shader的编程过程,如数据类型、变量、矩阵操作、控制流,并阐述了Uniforms、Attributes和Varyings的特性及其在Shader中的作用。此外,还讨论了如何获取和设置Uniforms以及处理Vertex Attributes的方法。
摘要由CSDN通过智能技术生成

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               

一、本文关注的问题:

• Shader and program 对象介绍
• 创建并编译一个Shader对象
• 创建并链接一个Program对象
• 获取并设置uniforms
• 获取并设置attributes

      在OpenGL ES中,每个program对象有且仅有一个Vertex Shader对象和一个Fragment Shader对象连接到它。 

      Shader:类似于C编译器

      Program:类似于C链接器

      glLinkProgram操作产生最后的可执行程序,它包含最后可以在硬件上执行的硬件指令。

二、Shader和Program编程概述

1. 创建Shader
      1)编写Vertex Shader和Fragment Shader源码。

      2)创建两个shader 实例:GLuint   glCreateShader(GLenum type);

      3)给Shader实例指定源码。 glShaderSource

      4)在线编译shaer源码 void   glCompileShader(GLuint shader)

2. 创建Program

      1)创建program  GLuint   glCreateProgram(void)

      2)绑定shader到program 。 void   glAttachShader(GLuint program, GLuint shader)。每个program必须绑定一个Vertex Shader 和一个Fragment Shader。

      3)链接program 。 void   glLinkProgram(GLuint program)

      4)使用porgram 。 void   glUseProgram(GLuint program)

      对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。

 

三、 Shading Language中的数据类型与变量
1. Uniforms and Attributes

     Uniforms 是一个program 中统一分配的,vertext 和fragment中同名的Uniform必须同类型。对应于不经常变化的变量(用于存储只读常量值的变量)。

     Attributes 变化率高的变量。主要用来定义输入的每个点属性。

     Uniforms and Attributes 在shader中通过location 和 name 来对应的。

2. 数据类型

1)三类基本数据类型:float , int , boolean

2)复合类型:浮点、整型、布尔向量   vec2 , vec3,vec4。vector访问方式有以下两种:

      (1).操作:数学{x, y, z, w}, 颜色{r, g, b, a}或 纹理坐标{s, t, r, q},但不能混用,举例如下:

        vec3 myVec3 = vec3(0.0, 1.0, 2.0); // myVec3 = {0.0, 1.0, 2.0}
        vec3 temp;
        temp = myVec3.xyz; // temp = {0.0, 1.0, 2.0}
        temp = myVec3.xxx; // temp = {0.0, 0.0, 0.0}
        temp = myVec3.zyx; // temp = {2.0, 1.0, 0.0}

      (2)[ ]操作:[0]对应x,[1]对应y,[2]对应z,[3]对应w。[ ]中只能为常量或uniform变量,不能为整数量变量(如:i,j,k)。

 

3)矩阵:mat2, mat3,mat4 (按列顺序存储)

      mat3 myMat3 = mat3(1.0, 0.0, 0.0,  // 第一列
                                  0.0, 1.0, 0.0,  // 第二列
                                  0.5, 1.0, 1.0); // 第三列

     可用[ ]或.操作符来访问:

     mat4 myMat4 = mat4(1.0);   // Initialize diagonal to 1.0 (identity)
     vec4 col0 = myMat4[0];        // Get col0 vector out of the matrix
     float m1_1 = myMat4[1][1];  // Get element at [1][1] in matrix
     float m2_2 = myMat4[2].z;   // Get element at [2][2] in matrix

4)常量

     const float zero = 0.0;
     const float pi = 3.14159;
     const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
     const mat4 identity = mat4(1.0);

5)结构体: 用基本类型和复合类型构建结构体。

     struct fogStruct
     {
         vec4 color;
         float start;
         float end;
     } fogVar;
     fogVar = fogStruct(vec4(0.0, 1.0, 0.0, 0.0), // color
                                  0.5, // start
                                  2.0); // end
     vec4 color = fogVar.color;
     float start  = fogVar.start;
     float end   = fogVar.end;

6)数组:类似于C语言,索引从0开始。在创建时不能被初始化,索引只能为常量或uniform变量。

     float floatArray[4];
     vec4 vecArray[2];

7)操作

     支持的操作有:*,/,+,-,++,--,=,+=, -=, *=, /=,==, !=, <, >, <=, >=,&&,^^,||

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值