Qt OpenGL笔记

1、GLSL变量类型
参考链接:GLSL入门(非常详细)
1)vec2、vec3、vec4:n维浮点数向量
2)sampler2D:2D纹理
3)mat2, mat3, mat4:2x2, 3x3, 4x4 浮点数矩阵

2、GLSL 三种变量限定符
参考连接:OpenGL ES2.0 的三种变量类型(uniform,attribute和varying)
1)uniform
外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过函数glUniform**()函数赋值的。在(vertex和fragment)shader程序内部,uniform变量就像是C语言里面的常量(const ),它不能被shader程序修改。(shader只能用,不能改)
如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。(相当于一个被vertex和fragment shader共享的全局变量)
2)attribute
只能在vertex shader中使用的变量。(它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)
在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。
3)varying
是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。application不能使用此变量。

3、内置的特殊变量
1)在 vertex Shader 中:
output 类型的内置变量:

变量 说明 单位
highp vec4 gl_Position; gl_Position 放置顶点坐标信息 vec4
mediump float gl_PointSize; gl_PointSize 需要绘制点的大小,(只在gl.POINTS模式下有效) float

2)在 fragment Shader 中:
input 类型的内置变量:

变量 说明 单位
mediump vec4 gl_FragCoord; 片元在framebuffer画面的相对位置 vec4
bool gl_FrontFacing; 标志当前图元是不是正面图元的一部分 bool
mediump vec2 gl_PointCoord; 经过插值计算后的纹理坐标,点的范围是0.0到1.0 vec2

output 类型的内置变量:

变量 说明 单位
mediump vec4 gl_FragColor; 设置当前片点的颜色 vec4 RGBA color
mediump vec4 gl_FragData[n] 设置当前片点的颜色,使用glDrawBuffers数据数组 vec4 RGBA color

4、纹理查询函数
图像纹理有两种 一种是平面2d纹理,另一种是盒纹理,针对不同的纹理类型有不同访问方法.
纹理查询的最终目的是从sampler中提取指定坐标的颜色信息. 函数中带有Cube字样的是指 需要传入盒状纹理. 带有Proj字样的是指带投影的版本
1)以下函数只在vertex shader中可用:

vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);
vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);
vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod); vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod); 

2)以下函数只在fragment shader中可用:

vec4 texture2D(sampler2D sampler, vec2 coord, float bias);
vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias); 
vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias); 
vec4 textureCube(samplerCube sampler, vec3 coord, float bias);

3)在 vertex shader 与 fragment shader 中都可用:

vec4 texture2D(sampler2D sampler, vec2 coord);
vec4 texture2DProj(sampler2D sampler, vec3 coord);
vec4 texture2DProj(sampler2D sampler, vec4 coord);
vec4 textureCube(samplerCube sampler, vec3 coord);
//第一个参数代表图片纹理,第二个参数代表纹理坐标点,
//通过GLSL的内建函数texture2D来获取对应位置纹理的颜色RGBA值
texture2D(tex_y, textureOut).r;

4、QOpenGL流程
4.1 初始化流程(重写void initializeGL()函数)
1)创建shader对象:QGLShaderProgram program;
2)初始化opengl 函数:initializeOpenGLFunctions();
3)编写顶点着色器vertex shader程序vString、片段着色器texture shader程序tString
4)加载顶点着色器vertex shader程序、片段着色器texture shader程序:program.addShaderFromSourceCode(QGLShader::Vertex, vString); program.addShaderFromSourceCode(QGLShader::Fragment, tString);
5)将顶点坐标绑定到通道VERTEX_LOCATIONprogram.bindAttributeLocation("vertexIn", VERTEX_LOCATION);
6)将材质坐标绑定到通道TEXTURE_LOCATIONprogram.bindAttributeLocation("textureIn",TEXTURE_LOCATION);
7)链接shader:program.link();
8)绑定shader:program.bind();
9)顶点坐标ver,设置渲染时索引值为顶点通道VERTEX_LOCATION的顶点属性数组和格式,并使能:glVertexAttribPointer(VERTEX_LOCATION, 2, GL_FLOAT, 0, 0, ver); glEnableVertexAttribArray(VERTEX_LOCATION);
10)材质坐标tex,设置渲染时索引值为材质通道TEXTURE_LOCATION的顶点属性数组和格式,并使能:glVertexAttribPointer(TEXTURE_LOCATION, 2, GL_FLOAT, 0, 0, tex); glEnableVertexAttribArray(TEXTURE_LOCATION);
11)从shader获取材质:unis[0] = program.uniformLocation("tex_y"); unis[1] = program.uniformLocation("tex_u"); unis[2] = program.uniformLocation("tex_v");
12)创建材质texs,将各个YUV材质绑定到GL_TEXTURE_2D,设置材质过滤模式(放大、缩小过滤使用线性插值):glGenTextures(3, texs); glBindTexture(GL_TEXTURE_2D, texs[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13)申请各个YUV材质显卡空间内存:glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
14)申请YUV图片的CPU内存空间:datas[0] = new unsigned char[width*height]; //Y datas[1] = new unsigned char[width*height/4]; //U ...

4.2 画图流程(重写void paintGL()函数)
1)激活材质单元GL_TEXTURE0,并绑定到材质Y:glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texs[0]);
2)修改Y材质内容,从CPU内存拷贝到显卡内存:glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_UNSIGNED_BYTE, datas[0]);
3)与shader unis材质变量关联:glUniform1i(unis[0], 0);
4)U、V材质重复1)~3)步骤;
5)绘图,从数组数据中提取数据渲染基本图元:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

未完待续…

你可能感兴趣的:(QT,FFMPEG,OpenGL,音视频)