当前位置: 首页>数据库>正文

glsl传gpu数据 glsl opengl

一、基础

1、OpenGL ES 不同版本

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

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

3、数据

向量数据类型:

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_字符串,第1张

矩阵数据类型:

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_字符串_02,第2张

变量存储限定符:

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_着色器_03,第3张

3、基础

1).vsh / .fsh 

.vsh --> 顶点着色器  .fsh --> 片元着色器

.vsh / .fsh 文件,只是用来给开发者区分着色器代码。其本质是一串字符串,可以用string来写,但直接用字符串形式,不便于阅读维护。

2)数据修饰(uniform, attribute, varying)

1. uniform:1)客户端代码 --> 传递 顶点/片元着色器里的 变量;

传进来后一般是只拿来使用,而不在着色器中进行修改,即:不经常变化的一些数据一般用 uniform 传;

传什么(用来修饰什么):一般传 视图矩阵、投影矩阵、投影视图矩阵。

传递方法:gluniformXXX

举例:着色器中代码:uniform mat4 viewProMatrix;// 4行4列的矩阵 变量 viewProMatrix,传递方式使用 uniform 传递

    客户端往里面传值:gluniformXXX 方法。

2. attribute:1)客户端代码 --> 只能传到 顶端着色器中 --> 只能在顶点着色器中使用 

一般修饰:顶点、纹理坐标、颜色等 --> 一切和坐标、颜色相关的

传递方法:glvertexXXX --> 注意:传值一定要打开开关,因为默认 attribute 是关闭的。

举例: 着色器中代码:attribute vec4 position;  attribute vec4 color;  attribute vec2 texture; // 4维向量 position,修饰符 attribute 表示 它使用attribute 方式传递。

3. varying:当数据需要通过 顶点着色器间接的传递到片元着色器时 会用 varying 修饰

纹理坐标 通过顶点着色器间接传到片元着色器:varying lowp vec2 ;// lowp 表示低精度-> 纹理坐标本就是0~1所以使用低精度即可

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_句柄_04,第4张

 

注意:客户端传值,需要在着色器中的声明和客户端代码中的声明 一致 --> 若着色器中没有相关声明,表示没有传给着色器相应数据。

二、运行过程与 API

1、过程

需要创建 2 个基本对象才能⽤着⾊器进行渲染:着⾊器对象和程序对象。

获取 链接后着⾊器对象 的过程 一般包括以下 6 步:

  1、创建⼀个顶点着⾊器对象和⼀个⽚段着⾊器对象

  2、将源代码链接到每个着⾊器对象

  3、编译着⾊器对象

  4、创建⼀个程序对象

  5、将编译后的着⾊器对象连接到程序对象

  6、链接程序对象

2、主要 API

/*  
type: 创建着⾊器的类型,GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER
返回值: 指向新着⾊器对象的句柄.可以调⽤ glDeleteShader 删除 
*/
GLuint glCreateShader(GLenum type);

// shader: 要删除的着⾊器对象句柄
void glDeleteShader(GLuint shader);

/* 
shader — 指向着⾊色器器对象的句句柄
count: 着⾊器源字符串的数量,着⾊器可以由多个源字符串组成,但是每个着⾊器只有⼀个 main 函数 
string: 指向保存数量 count 的着⾊器源字符串的数组指针
length: 指向保存每个着⾊器字符串⼤小且元素数量为 count 的整数组指针 
*/
void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length);

// shader:需要编译的着⾊器对象句柄 
void glCompileShader(GLuint shader); 

/*
shader:需要编译的着⾊器对象句柄
pname:获取的信息参数,可以为: GL_COMPILE_STATUS / GL_DELETE_STATUS / GL_INFO_LOG_LENGTH / GL_SHADER_SOURCE_LENGTH / GL_SHADER_TYPE 
params:指向查询结果的整数存储位置的指针
*/
void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );

/*
shader:需要获取信息⽇志的着⾊器对象句柄
maxLength:保存信息⽇志的缓存区⼤小
length:写⼊的信息日志的长度(减去 null 终止符), 如果不需要知道长度,这个参数可以为 Null 
infoLog:指向保存信息⽇志的字符缓存区的指针
*/
void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog); 

/*
创建一个程序对象
返回值: 返回⼀个执⾏行新程序对象的句柄 
*/
GLUint glCreateProgram( ); 

// program:指向需要删除的程序对象句柄 
void glDeleteProgram( GLuint program ) 

/* 
着⾊器与程序连接/附着
program : 指向程序对象的句柄
shader : 指向程序连接的着⾊器对象的句柄 
*/
void glAttachShader( GLuint program , GLuint shader ); 

// 断开连接
void glDetachShader(GLuint program); 

// link
glLinkProgram(GLuint program); 

/*
链接程序之后, 需要检查链接是否成功. 可以使用 glGetProgramiv 检查链接状态.
program: 需要获取信息的程序对象句柄 
pname : 获取信息的参数,可以是: 
GL_ACTIVE_ATTRIBUTES 
GL_ACTIVE_ATTRIBUTES_MAX_LENGTH 
GL_ACTIVE_UNIFORM_BLOCK 
GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH 
GL_ACTIVE_UNIFROMS 
GL_ACTIVE_UNIFORM_MAX_LENGTH 
GL_ATTACHED_SHADERS 
GL_DELETE_STATUS 
GL_INFO_LOG_LENGTHGL_LINK_STATUS 
GL_POGRAM_BINARY_RETRIEVABLE_HINT 
GL_TRANSFORM_FEEDBACK_BUFFER_MODE 
GL_TRANSFORM_FEEDBACK_VARYINGS 
GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 
GL_VALIDATE_STATUS

params : 指向查询结果整数存储位置的指针 
*/
void glGetProgramiv (GLuint program,GLenum pname, GLint *params); 

/*
从程序信息⽇志中获取信息
program : 指向需要获取信息的程序对象句柄
maxLength : 存储信息⽇志的缓存区⼤小
length : 写⼊的信息日志⻓度(减去 null 终⽌符),如果不需要知道⻓度,这个参数可以为 Null. 
infoLog : 指向存储信息日志的字符缓存区的指针 
*/
void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog ) 

// program: 设置为活动程序的程序对象
void glUseProgram(GLuint program)

三、RenderBuffer 和 FrameBuffer

RenderBuffer 渲染缓冲区对象是由应用程序分配的2D图像缓冲区。渲染缓冲区可用于分配和存储 颜色、深度或模板值,并可用作帧缓冲区对象中的颜色、深度或模板附件。渲染缓冲区类似于提供可绘制表面的离屏窗口系统,例如 pbuffer。但是,渲染缓冲区不能直接用作 GL 纹理。

--> RenderBuffer 为颜色、深度、模板缓冲值提供了附着点,而 RenderBuffer 又被附加到 FrameBuffer。

  FrameBufferObject(FBO) 更类似与一个管理者。

RenderBuffer 分为:颜色、深度、模板 缓冲区

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_字符串_05,第5张

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_句柄_06,第6张

 

glsl传gpu数据 glsl opengl,glsl传gpu数据 glsl opengl_glsl传gpu数据_07,第7张

 




https://www.xamrdz.com/database/6b91944557.html

相关文章: