OpenGL-探路篇

一、渲染

1)含义:从模型创建最终图像的过程



二、着色器(shader) :同一时刻只能有一个着色器起作用

1)含义:专为图形处理单元(GPU)编写的一种小程序(用GLSL/OpenGL Shading Language 编写)

2)包括:顶点着色器(vertex)-> 细分着色器(增加图元) -> 几何着色器(调整图元) -> 片元着色器(主要处理光栅化后的片元数据)

  *顶点着色器的输出必须与片元着色器的输入匹配

  ——补充:

      顶点 -> 图元(点、线段、多边形) -> 片元 -> 像素(需经过测试,包括所有权测试、裁剪测试、深度测试、alpha测试、模板测试)-> 帧缓冲区 -> 映射到显示

      片元:比像素多一些颜色、深度、纹理信息(候选像素)

      光栅化:图元转换为片元的过程,片元为二维图像,每个点包含颜色、深度、纹理信息,该点和相关信息为一个片元。

3)创建着色器对象(glCreateShader)-> 关联着色器代码(glShaderSource)-> 编译(glCompileShader)-> 创建多个着色器。。。-> 创建着色器程序(glCreateProgram)-> 关联着色器到着色器程序(glAttachShader)-> 连接着色器程序(glLinkProgram)-> 启用着色器程序(glUseProgram)



三、三个函数前缀:

1)glGen*:生成引用名称,类似指针

2)glBind*:分配内存

  例如:glBindVertexArray(GLuint array) -> 如果array是glGen*创建的引用,则生成一个新的顶点数组与引用关联,或者激活已存在的顶点数组对象。-》作为当前对象。

  绑定时间:创建对象并初始化时、再次使用未被绑定的对象时

3)glDelete*:删除对象

  注:通过gllsVertexArray(GLuint array)判断某一名称是否已经被保留为一个顶点数组对象



四、将数据载入缓存对象

  例:glBufferData(GLenum target,GLsizeiptr size, const GLvoid *data, GLenum usage)

            -> 1、分配顶点数据所需要的储存空间

            2、将数据从应用程序的数组拷贝到OpenGL服务端的内存中

    参数说明:target -> 数据类型

         usage -> 分配数据之后的读写方式。

    函数说明:将size大小的数据从客户端拷贝到服务端



五、着色器编写

  

// 传递着色器
#version 430 core
/*
  layout 布局限定符,目的为变量提供元数据
  in 数据流入
  out 数据流出
*/

layout(location = 0) in vec4 vPosition;  // 着色器变量是着色器与外部世界的联系所在

void main() {
        gl_position = vPosition;
}
#version 430 core

out vec4 fColor;

void main() {
       fColor = vec4(0.0,0.0,1.0,1.0);
}


六、将应用程序与着色器之间,以及不同着色阶段之间的数据通道连接起来 -> 着色管线装配过程。



2017-02-23  



七、uniform(始终如一)变量:从应用程序接收数据,不会随着顶点或片元的改变而改变。对于给定的图元而言是个常量。着色器无法改变该类型的值。

1)在应用程序中改变该类型的值,需先获取其在uniform索引列表中的索引 -> glGetUniformLocation(GLuint program,const char* name),获得索引之后,需要将uniform块与缓冲对象关联,(ps:glUniformBlockBinding手动绑定)

2)uniform位置是在着色器链接的时候产生的(glLinkProgram())

3)uniform块中只能包含透明类型的变量

4)布局限定符

    shared:多个程序共享

    packed:设置uniform占最小内存空间,但会禁止程序间共享

    row(column)_major:行/列主序存储方式

5)uniform块名称不能作为uniform变量的父名称,因此两个uniform变量不能同名



八、GLSL:

1)类型修饰符:const \ in \ out \ uniform \ shared \ buffer(共享)

2)discard语句会让片元着色器立即终止,从而丢弃片元。

3)invariant和precise关键字可以保证在图形设备计算的不变性。

  可通过预编译将着色器中的所有变量设置为invariant -> #pragma STDGL invariant(all)

  区别:如果数值发生变化,但数学上并不影响结果,则用precise,如交换律



2017-02-24 09:23:55



九、子程序池

1)步骤:

    1.定义子程序类型  ->   subroutine returnType funcPoolName ( type1 param1...);

    2.声明子程序  ->  subroutine (funcPoolName) returnType func1()..

    3.函数指针  ->  subroutine uniform funcPoolName funcPointer;

2)指定所用的子程序:glUniformSubroutinesuiv(GLenum shaderType , GLsizei count , const GLuint* indices) -> 设置所有count个子程序uniform使用indices数组中的值。

  粒子:如indices[n](n为函数指针uniform的location)为func1的索引(通过glGetSubroutineIndex获得)

时间: 2024-10-06 06:04:29

OpenGL-探路篇的相关文章

OpenGL 第一篇 概览

------------------------------------------------------------------------------------------------------------------------ 从现在开始,认真学习OpenGL的相关知识,把读过的每一章都做记录,希望能坚持到最后. -------------------------------------------------------------------------------------

和馅饼一起学opengl 第一篇——总概

写在前面 这个系列是关于OpenGL(以下称OGL)的一些入门学习,虽然旨在入门,但是我却不想把它写得过于简单(当然是相对的,会者不难),首先这系列要肯定的一点是一定会有编码,有实例来帮助大家一起学习,但是套用一句侯捷先生说过的话,勿在浮沙筑高台,所以我会说一些晦涩的关于OGL的理论知识,如其RC的概念,状态机等等,旨在深入浅出OGL,同时,我也在学习中,所以错误在所难免,请大家不要给我面子一定要狠狠的指出来,那么有疑问的地方我一定会寻找更多的证据来解释,所以,本系列希望达到的是一个双赢的效果,

【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(一)

OpenGL是一个开源的图形库,既可开发二维图形软件,也可开发三维图形软件.许多知名应用就是基于OpenGL开发出来,如著名的Artoolkit和Unity3D. GLUT是代表OpenGL应用工具包,英文全称为OpenGL Utility Toolkit,是一个和窗口系统无关的软件包,它由Mark Kilgard在SGI时写的.作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性.(百度百科) 因为OpenGL的API是底层图形库API,使用起来还是有些复杂,所以,我打算使用面

Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)

? 来自:http://www.cnblogs.com/xiaobo68688/archive/2011/12/01/2269985.html ? 首先我们在屏幕中心显示一个矩形,效果如图: // 代码没有经过优化,为的是容易理解public class OpenGLTestActivity extends Activity { GLSurfaceView glView; @Override public void onCreate(Bundle savedInstanceState) { su

[图形学] 计算机图形学 with OpenGL第一篇

<计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode8.3.2. 代码目录是:https://github.com/p0e0o0p0l0e0/Computer_Graphics.git 目标学习内容有以下几章,已经学到第8章. 第3章:计算机图形学软件 第4章:输出图元 第5章:图元的属性 第6章:实现图元及属性的算法 第7章:二维几何变换 第8章:二维观察 第9

走向DBA[MSSQL篇] 积跬步行千里

原文:走向DBA[MSSQL篇] 积跬步行千里 不知道大家对SQL系列的感不感兴趣 先在这里探个路 本文针对的读者为SQL菜鸟 欢迎大牛驳论或者补充 既然是探路篇 就先说下数据过滤中的偏门匹配 希望能给大家带来收获 create table 虫子的临时表 ( 编号 varchar(30), 名称 varchar(30), 备注 varchar(100) ) insert into 虫子的临时表 values('编号01','name01','这是一个奇迹') insert into 虫子的临时表

跟Google 学代码:Building Apps with Graphics &amp; Animation(一)

引言 可以右键保存我做的思维导图: Google这一章的课程共分为四大部分: 我做的思维导图: 高效展示篇 OpenGl使用篇 View动画 使用动画集 考虑精力和博客篇幅,本篇仅仅涉及Building Apps with Graphics & Animation 第一节 Displaying Bitmaps Efficientlty Displaying Bitmaps Efficientlty (高效展示图片) 加载大图 图片有各种各样的形状和尺寸,很多情况下,一款热门的App需要展示很多大

诗经 全文

诗经 全文 (带注释和译文) http://www.edu009.com/Article/HTML/Article_60756.html <诗经> 春秋·孔丘 <诗经>是我国第一部诗歌总集,先秦时代称为“诗”或“诗三百”,孔子加以了整理.汉武帝采纳董仲舒“罢黜百家,独尊儒术”的建议,尊“诗”为经典,定名为<诗经>. <诗经>现存诗歌 305 篇,包括西周初年到春秋中叶共 500 余年的民歌和朝庙乐章,分为风.雅.颂三章. “风”包括周南.召南.邶.鄘.卫.王

【OpenGL】第二篇 Hello OpenGL

------------------------------------------------------------------------------------------------------------------------------- 就像学习其他编程语言一样,为了顺利写下第一个OpenGL程序 我们必须不辞辛苦的先铺好砖块,搭建好环境…… 所以接下来让我先把所需要的库的环境安置好,再开始coding. ------------------------------------

openGL学习笔记二:看看上一篇我们写的代码

哈哈, 千呼万唤始出来, 我们第二篇笔记新鲜出炉了( 话说不是没隔多久么....) 呵呵, 闲话不多说, 我们来看看上一篇我们写的代码, 知其然也要知其所以然啊 #include <gl/glut.h> void display() { glClear( GL_COLOR_BUFFER_BIT); glRectf( -1, -1, 1, 1); glFinish(); } int main( int argc, char* argv[]) { glutInit( &argc, argv