Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也用以提供给有兴趣了解着色器的编译.连接等原理的人. 因为程序基本都是自己实现的,所以,只需要包含最基本的OpenGL头文件即可运行. 效果如下: Background 由于固定管线编程过程中涉及的大量计算(当然,上个例子并没有多少计算量)都是再CPU上进行的,而这些可能影响CPU处理其他事情的效率,所以不妨运…
我们今天来讲调试信息,这个东西讲起来会比较无聊,因为都是一些函数调用,没啥可讲的,函数就是那样用的,不过其效果挺好玩的,同时在程序设计中也是很必要的,所以还是来写一下,不过,就是因为知识比较固定且简单,所以我们 一篇就覆盖三节的内容吧: 1. 获取当前活动的顶点属性和对应索引 2.获取当前活动的uniform量和对应索引 2.Debug Getting Ready 我们以上一节的旋转三角形的例子来讲这一篇. 当我们的shader program编译连接完成之后,所有的量都已经分配了自己的索引,这…
恭喜,我们终于很扎实地完成了第一章——glsl 入门 不幸的是,it's not the basic of GLSL shader ,我们下一节开篇,basic of GLSL shader 在下一章开篇之前,我们先来把我们第一章学到的东西封装一下,大家应该能够体会到,很多东西都是固定的模块,所以,为了进一步的盖高楼,我们把根基技术包装为一个产品,之后我们就不重复做根基的制作了. 更不幸的是,看了下第二章第一节: 漫反射环,什么光强表面辐射啊,光反射啊,线性代数吖,虽然对于学院派公式不是很头疼,…
重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix glLoadIdentity(); // First, transform the camera (viewing matrix) from world space to eye space // Notice all values are negated, because we move the w…
一.Android平台上下文环境的创建及初始化 1. 首先实例化Android上下文环境,即EGL的初始化. bool EGLCore::init(EGLContext sharedContext) { EGLint numConfigs; EGLint width; EGLint height; , EGL_ALPHA_SIZE, , EGL_BLUE_SIZE, , EGL_GREEN_SIZE, , EGL_RED_SIZE, , EGL_RENDERABLE_TYPE, EGL_OPEN…
Sending data to a shader using uniform Preface 上一节我们介绍了通过顶点属性量进行数据传递,今天我们介绍一下通过uniform变量来进行数据传递的方法. 注意:此处的uniform与vertex attributes为两种数据量,不具相互替换性,功能各不相同,各司其职 uniform量更适用于着色器程序中可能改变的量,比如说,矩阵变换. 当然了,我们今天是带着例子来的,通常情况下,我们每讲一节都会给出一个例子,为了弥补上一节缺的一个例子,我们这次给大…
Sending data to a shader using vertex attributes and vertex buffer object 上次我们说到着色器的编译和连接,后面的事情没有做过多的阐述,所以我们今天继续上次的. 今天所讲的也是OpenGL着色器编程中非常重要的一个环节,叫做:数据传递 它主要承担的任务呢就是把opengl主程序中的数据传递到着色器中,上一节,我们已经把着色器准备好了,本节,我们将把主程序中的数据传递到着色器中进行处理. 说到数据传递,它其实分两种: 1.使用…
在为shader program pass uniform之前一定要先use program.…
1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform variables:一个只读的全局变量是为所有的顶点绘制调用 2.除了用户定义的输入变量,GLSL为每个Vertex定义了一组输入属性(内置变量), in int gl_VertexID; in int gl_InstanceID; gl_VertexID:当前被处理的顶点的索引.它是当前顶点在数组中的索引…
常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, GLuint shader); GLint glGetUniformLocation(GLuint shaderID, const GLchar* varName); 返回一个有符号的整数,代表在shaderID指定的着色器中由varName命名的变量的位置.在一个着色器进行编译和连接之后,我们必须…
GLSL,OpenGL Shading Language,GLSL中没有指针,并且没有任何类型的字符串或字符. (1)GLSL的修饰符与基本数据类型 const:用于声明非可写的编译时常量变量: attribute:用于经常更改的信息,只能在顶点着色器中使用: uniform:用于不经常更改的信息,可用于顶点着色器和片元着色器: varying:用于修饰从顶点着色器向片元着色器传递的变量. 然后是基本数据类型,int.float.bool.注意float可以指定精度: highp:32bit,一…
第一节:图形处理器简史 GPU发展简史 GPU英文全称Graphic Procssing Unit. T&L变换和光照流水线 可编程GPU GPU的优点和缺点 第二节:Unity Shader Shader和渲染管线 什么是shader 中文翻译是着色器,是一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写.一句话概括:shader是可编辑图形管线的算法片段. 它主要分为两类,vertexshader和fragmentshader: 什…
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubShader Pass { //设置渲染状态和标签 //开始CG代码片段 CGPROGRAM //该代码的预编译指令,例如: #pragma vertex vert #pragma fragment frag //CG代码写在这儿 ENDCG //其他设置 } } SubShader { //针对显卡B的SubSh…
纹理单元的理解 Shader中要用到纹理: uniform sampler2D texture1; Main读取图片数据,创建了纹理: unsigned int texture1; 怎么把c++里加载的纹理传给shader程序里呢? 这就要用到纹理单元. glBindTexture(GL_TEXTURE_2D, texture1); 这条代码将纹理texture1传递给了正在使用的着色器程序里的uniform sampler2D texture1 中间隐含过程是,opengl有许多默认的纹理单元…
/*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h> void display_demo01(); void display_demo1_idle(); int main(int argc, const char * argv[]) { glutInit(&argc, argv); glutCreateWindow("Fredric…
参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test * * Fredric : 2016-7-8 */ #include <GLUT/GLUT.h> void display_demo01(); void display_demo02(); void display_demo03(); void display_demo04(); /* * Ma…
在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient.RadialGradient以及SweepGradient.其中,BitmapShader用于图像渲染:ComposeShader用于混合渲染:LinearGradient用于线性渲染:RadialGradient用于环形渲染:而SweepGradient则用于梯度渲染. 使用Shader类进行图…
能找到最好的解释来自:http://www.gamedev.net/topic/489879-glpushmatrixglpopmatrix--glloadmatrixf/ 原理: glPushMatrix didn't fail to push onto the stack; it's job is to push a copy of the current matrix onto a stack of matrices. Those matrices on the stack don't i…
GL_ARRAY_BUFFER(表示顶点数据) GL_ELEMENT_ARRAY_BUFFER(表示索引数据) GL_PIXEL_UNPACK_BUFEER( 表示传递给O p e n G L 的像素数据) GL_PIXEL_PACK_BUFFER(表示从OpenGL获取的像素数据) GL_COPY_READ_BUFFER 和GL_COPY_WRITE_BUFFER(表示在缓冲区之间复制数据) GL_TEXTURE_BUFFER(表示作为纹理缓冲区存储的纹理数据) GL_DYNAMIC_DRAW…
GLSL着色器代码分为两个部分,即Vertex Shader(顶点着色器)与Fragment Shader(片元着色器). 上下文环境搭建 OGL不负责窗口管理与上下文环境管理,该职责由平台完成.在Android平台,该职责由EGL来完成,iOS平台是EAGL完成. OGL渲染管线分为如下几个阶段: 1. 指定几何对象 glDrawArrays,有三种绘制方式: GL_POINTS:以点的形式进行绘制,通常用在绘制粒子效果的场景中: GL_LINES:以线的形式进行绘制,通常用在绘制直线的场景中…
GLTools: 一些有用且可复用的函数 GLEW: OpenGL API的一些扩展机制 GLUT: OpenGL Utility toolkit, OpenGL跨平台相关,隐藏平台相关细节 RC代表渲染环境(Rendering Context),是运行中的OpenGL状态机句柄 使用OpenGL绘制三角形: // Triangle.cpp // Our first OpenGL program that will just draw a triangle on the screen. #inc…
欲以此分类来记录opengl的学习历程,此为第一篇,所以先来一个固定管线的例子,以及对双缓存的测试. 一.配置环境 写之前,先进行配置,然后再讲内容. 注:第一部分涉及的代码均忽略. [环境配置传送门] 二.所需知识 1. opengl程序结构 main函数结构大体上由如下几个步骤: ) glutInit(&argc, argv); 读取命令行参数,初始化glut ) glutInitDisplayMode(unsigned int mode); 设置显示模式(或窗口类型) (本节涉及参数如下)…
#include "iostream" #include <GL/glut.h> #include<cmath> #include<vector> #include<algorithm> #include<fstream> #include "MatrixV.h" #define PI acos(-1) using namespace std; #pragma comment(lib, "lega…
Plane Equation 注:面可理解为:连接面上的点与原点,投影相同(为:a*x1+b*x2+c*x3) OpenGL Matrix Class (C++) Overview OpenGL fixed pipeline provides 4 different types of matrices (GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE and GL_COLOR) and transformation routines for these matri…
先来看看一张图 shader都是在运行时编译和执行的,每个shader都有一个main函数作为它的入口. vertex shader的功能有两个:一个是计算顶点坐标变换,另一个就是为片元shader计算逐顶点信息. fragment shader在每个像素片上会执行,如上图的4和5,它的功能是计算片元即fragment的颜色值,一般来说,这类shader会计算颜色插值,纹理坐标计算,纹理提取,法线插值,光照,雾效等等.上图里的6是光栅化处理后的图像,framebuffer即帧缓存里的一个pixe…
1. 本函数可以禁用多边形正面或背面上的光照.阴影和颜色计算及操作,消除不必要的渲染计算是因为无论对象如何进行旋转或变换,都不会看到多边形的背面.用GL_CULL_FACE参数调用glEnable和glDisable可以启用或禁用剔除. glEnalbe(GL_CULL_FACE) 开启剔除操作效果 glDisable(GL_CULL_FACE) 关闭剔除操作效果 2. 当我们需要绘制透明图片时,就需要关闭它 glDisable(GL_DEPTH_TEST); 3. glBlendFunc ht…
1. varying vec2 vTextureCoord; 不能用in vec2 ,varying 表示在vs 和 fs中都可见. 2. android 里面 0 和1 都要打小数点 比如0.0 1.0 ,不然会出错!!!这是和windows的明显不同 3.precision mediump float; 这句话表示opengl的兼容性,如果不加 程序可能运行不了…
cd /etc/ld.so.conf.d目录中有 i386-linux-gnu_GL.conf and x86_64-linux-gnu_GL.conf等文件cat x86_64-linux-gnu_GL.conf/usr/lib/nvidia-340 /usr/lib32/nvidia-340 但是文件i386-linux-gnu_GL.conf 是空文件,这时需要把 x86_64-linux-gnu_GL.conf中的内容复制到i386-linux-gnu_GL.conf sudo ldco…
1. 经常使用优化工具 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXlBcnJvdw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none; max-width: 100%;" /> 2. 经常使用优化方案 OpenGL ES优化的主要工作是在图形…
首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上,开发者可以使用跨平台应用编程接口创建二维或者三维图形,或进行图像处理和计算机视觉应用,结合两者将能构建丰富有趣的交互体验.前者称为OpenGL,后者称为OpenCV,不过本文主要介绍前者,OpenCV在后续文章中涉及.OpenGL应用于桌面系统的历史已经很长了,但考虑到移动平台的特点(计算能力.性能等),将…