美文网首页OpenGL
OpenGL ES GLSL 基本概念

OpenGL ES GLSL 基本概念

作者: MonKey_Money | 来源:发表于2020-07-28 09:47 被阅读0次

OpenGL ES 的版本

OpenGL ES 1.X :针对固定功能流⽔水管线硬件
OpenGL ES 2.X :针对可编程流⽔水管线硬件
OpenGL ES 3.X :OpenGL ES 2.0的扩展

EGL (Embedded Graphics Library )

1.OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制
2.渲染上下文: 存储相关OpenGL ES 状态
3.绘制表面: 是用于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜色缓存 区,深度缓冲区和模板缓存区.
4.OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原生窗口系 统. EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗口系统之间的接口. 唯一⽀持 OpenGL ES 却不⽀持EGL 的平台是iOS

EGL的主要功能如下

  1. 和本地窗口系统(native windowing system)通讯
    2.查询可用的配置
    3.创建OpenGL ES可用的“绘图表面”(drawing surface)
    4.同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
    5.管理“渲染资源”,⽐如纹理映射(rendering map)。

GLSL数据类型

基本数据类型

类型 描述
整数 分为有符号(int)和无符号整数(uint)
浮点型 一般都是使用单精度浮点型(float)
布尔值 bool
bool bDone = false;//布尔值,真(true)或者假(false)
int iValue = 42;
uint uiValue = 32;
float fValue = 42.f;

向量数据类型

类型 描述
vec2,vec3,vec4 2分量、3分量、4分量浮点向量
ivec2,ivec3,ivec4 2分量、3分量、4分量整型向量
uvec2,uvec3,uvec4 2分量、3分量、4分量无符号整型向量
bvec2,bvec3,bvec4 2分量、3分量、4分量bool型向量

1.向量类型可以像基本数据类型一样进行声明,
vec4 vVertexPos = vec4(39.f,10.f,20.f,1);
2.着色器语言的向量不是类,他们有自己的内建数据类型,向量可以被赋值给另一个向量,也可以相加,也可以用一个标量进行缩放

c += vec4(1.f,2.f,3.f,1.f);
vVertexPos = vVertexPos3;
vVertexPos *= 4.f;

3.OpenGL着色语言对一个向量的独立元素进行寻址的方式,我们用点号来确定多达4个向量元素的地址,可以使用下列3组标识符中的任意一组:xyzw,rgba,stpq,

vVertexPos.x = 3.f;
vVertexPos.xy = vec2(1.f,2.f);
vVertexPos.xyz = vNewPos.xyx;
vOupColor.r = 0.4f;

矩阵数据类型

类型 描述
mat2,mat2x2 两⾏两列
mat3,mat3x3 三⾏三列
mat4,mat4x4 四⾏四列
mat2x3 三行两列
mat2x4 四⾏两列
mat3x2 两⾏三列
mat3x4 四⾏三列
mat4x2 两⾏四列
mat4x3 三⾏四列
mMat4Mode[2] = vec4(1.f,2.f,3.f,4.f);
vec4 vecModel = mMat4Mode[3];
vec3  vec3Mode = mMat4Mode[2].xyz;
mat4 mat4Mode = mat4(
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
);

变量存储限定符号

着色器语言变量声明也可以指定一个存储限定符,限定符用于将变量标记为输入变量(in或者uniform),输出变量(out)或者常量(const)

限定符 描述
<none> 只是普通的本地变量,外部不见,外部不可访问
const ⼀个编译常量,或者说是一个对函数来说为只读的参数
in/varying 从以前阶段传递过来的变量
in/varying centroid ⼀个从以前的阶段传递过来的变量,使用质心插值
out/attribute 传递到下一个处理阶段或者在一个函数中指定一个返回值
out/attribute centroid 传递到下⼀个处理阶段,质心插值
uniform ⼀个从客户端代码传递过来的变量,在顶点之间不做改变
image.png

自定义着色器过程

编写着色器

//顶点着色器
attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;

void main()
{
    varyTextCoord = vec2(1.0-textCoordinate.x,1.0-textCoordinate.y);
    gl_Position = position;
}

//片元着色器
precision highp float;
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;

void main()
{
        gl_FragColor = texture2D(colorMap, varyTextCoord);

}

编译连接着色器

//创建程序
 GLint program = glCreateProgram();
 //读取文件路径字符串
    NSString* content = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];
    const GLchar* source = (GLchar *)[content UTF8String];
    //创建一个shader(根据type类型)
//GL_VERTEX_SHADER顶点着色器
//GL_FRAGMENT_SHADER片元着色器
    *shader = glCreateShader(type);
 //将着色器源码附加到着色器对象上。
    //参数1:shader,要编译的着色器对象 *shader
    //参数2:numOfStrings,传递的源码字符串数量 1个
    //参数3:strings,着色器程序的源码(真正的着色器程序源码)
    //参数4:lenOfStrings,长度,具有每个字符串长度的数组,或NULL,这意味着字符串是NULL终止的
    glShaderSource(*shader, 1, &source,NULL);
    //把着色器源代码编译成目标代码
    glCompileShader(*shader);
 //创建最终的程序
    glAttachShader(program, verShader);
    glAttachShader(program, fragShader);
 //释放不需要的shader
    glDeleteShader(verShader);
    glDeleteShader(fragShader);
//链接着色器
    glLinkProgram(self.myPrograme);
    GLint linkStatus;
    //获取链接状态
    glGetProgramiv(self.myPrograme, GL_LINK_STATUS, &linkStatus);
    if (linkStatus == GL_FALSE) {
        GLchar message[512];
        glGetProgramInfoLog(self.myPrograme, sizeof(message), 0, &message[0]);
        NSString *messageString = [NSString stringWithUTF8String:message];
        NSLog(@"Program Link Error:%@",messageString);
        return;
    }

使用program

   //使用program
    glUseProgram(self.myPrograme);

设置attribute值

//获取Attrib位置
    GLuint position = glGetAttribLocation(self.myPrograme, "position");
 //(2).设置合适的格式从buffer里面读取数据
    glEnableVertexAttribArray(position);
  //(3).设置读取方式
    //参数1:index,顶点数据的索引
    //参数2:size,每个顶点属性的组件数量,1,2,3,或者4.默认初始值是4.
    //参数3:type,数据中的每个组件的类型,常用的有GL_FLOAT,GL_BYTE,GL_SHORT。默认初始值为GL_FLOAT
    //参数4:normalized,固定点数据值是否应该归一化,或者直接转换为固定值。(GL_FALSE)
    //参数5:stride,连续顶点属性之间的偏移量,默认为0;
    //参数6:指定一个指针,指向数组中的第一个顶点属性的第一个组件。默认为0
    glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, NULL);

设置uniform值

//获取Uniform位置
GLuint location = glGetUniformLocation(self.myPrograme, "colorMap");
//设置纹理采样器 sampler2D
glUniform1i(location ,0);

相关文章

网友评论

    本文标题:OpenGL ES GLSL 基本概念

    本文链接:https://www.haomeiwen.com/subject/ylwxrktx.html