- 浏览: 1487203 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
原地址:http://blog.csdn.net/myarrow/article/details/7737313
http://www.cnblogs.com/sanjin/p/3580331.html
一、本文关注的问题:
• Shader and program 对象介绍
• 创建并编译一个Shader对象
• 创建并链接一个Program对象
• 获取并设置uniforms
• 获取并设置attributes
在OpenGL ES中,每个program对象有且仅有一个Vertex Shader对象和一个Fragment Shader对象连接到它。
Shader:类似于C编译器
Program:类似于C链接器
glLinkProgram操作产生最后的可执行程序,它包含最后可以在硬件上执行的硬件指令。
二、Shader和Program编程概述
1. 创建Shader
1)编写Vertex Shader和Fragment Shader源码。
2)创建两个shader 实例:GLuint glCreateShader(GLenum type);
3)给Shader实例指定源码。 glShaderSource
4)在线编译shaer源码 void glCompileShader(GLuint shader)
2. 创建Program
1)创建program GLuint glCreateProgram(void)
2)绑定shader到program 。 void glAttachShader(GLuint program, GLuint shader)。每个program必须绑定一个Vertex Shader 和一个Fragment Shader。
3)链接program 。 void glLinkProgram(GLuint program)
4)使用porgram 。 void glUseProgram(GLuint program)
对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。
三、 Shading Language中的数据类型与变量
1. Uniforms and Attributes
Uniforms 是一个program 中统一分配的,vertext 和fragment中同名的Uniform必须同类型。对应于不经常变化的变量(用于存储只读常量值的变量)。
Attributes 变化率高的变量。主要用来定义输入的每个点属性。
Uniforms and Attributes 在shader中通过location 和 name 来对应的。
2. 数据类型
1)三类基本数据类型:float , int , boolean
2)复合类型:浮点、整型、布尔向量 vec2 , vec3,vec4。vector访问方式有以下两种:
(1).操作:数学{x, y, z, w}, 颜色{r, g, b, a}或 纹理坐标{s, t, r, q},但不能混用,举例如下:
vec3 myVec3 = vec3(0.0, 1.0, 2.0); // myVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp = myVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp = myVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp = myVec3.zyx; // temp = {2.0, 1.0, 0.0}
(2)[ ]操作:[0]对应x,[1]对应y,[2]对应z,[3]对应w。[ ]中只能为常量或uniform变量,不能为整数量变量(如:i,j,k)。
3)矩阵:mat2, mat3,mat4 (按列顺序存储)
mat3 myMat3 = mat3(1.0, 0.0, 0.0, // 第一列
0.0, 1.0, 0.0, // 第二列
0.5, 1.0, 1.0); // 第三列
可用[ ]或.操作符来访问:
mat4 myMat4 = mat4(1.0); // Initialize diagonal to 1.0 (identity)
vec4 col0 = myMat4[0]; // Get col0 vector out of the matrix
float m1_1 = myMat4[1][1]; // Get element at [1][1] in matrix
float m2_2 = myMat4[2].z; // Get element at [2][2] in matrix
4)常量
const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);
5)结构体: 用基本类型和复合类型构建结构体。
struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
fogVar = fogStruct(vec4(0.0, 1.0, 0.0, 0.0), // color
0.5, // start
2.0); // end
vec4 color = fogVar.color;
float start = fogVar.start;
float end = fogVar.end;
6)数组:类似于C语言,索引从0开始。在创建时不能被初始化,索引只能为常量或uniform变量。
float floatArray[4];
vec4 vecArray[2];
7)操作
支持的操作有:*,/,+,-,++,--,=,+=, -=, *=, /=,==, !=, <, >, <=, >=,&&,^^,||
float myFloat;
vec4 myVec4;
mat4 myMat4;
myVec4 = myVec4 * myFloat; // Multiplies each component of myVec4
// by a scalar myFloat
myVec4 = myVec4 * myVec4; // Multiplies each component of myVec4
// together (e.g., myVec4 ^ 2 )
myVec4 = myMat4 * myVec4; // Does a matrix * vector multiply of
// myMat4 * myVec4
myMat4 = myMat4 * myMat4; // Does a matrix * matrix multiply of
// myMat4 * myMat4
myMat4 = myMat4 * myFloat; // Multiplies each matrix component by
// the scalar myFloat
前面矩阵的行数就是结果矩阵的行数,后面矩阵的列数就是结果矩阵的列数。
8)自定义函数:
vec4 myFunc(inout float myFloat, // inout parameter
out vec4 myVec4, // out parameter
mat4 myMat4); // in parameter (default)
函数不能递归调用,因为GPU不一定有Stack和流控。
9)Shading Language内嵌函数
主要有以下几类函数:
(1)角度和三角函数
(2)指数函数
(3)通用函数(绝对值、取整、取余、取小数部分等)
(4)几何函数
(5)矩阵函数
(6)向量比较函数
(7)纹理查找函数
(8)Derivative函数
10)控制流
if(color.a < 0.25)
{
color *= color.a;
}
else
{
color = vec4(0.0);
}
//For循环。只支持常数循环次数。
//无论下标,还是循环变量,都只能使用编译时可确定的常数。
for(int i = 0; i < 3; i++)
{
sum += i;
}
以下不允许(因为下标为变量或loop次数为变量):
float myArr[4];
for(int i = 0; i < 3; i++)
{
sum += myArr[i]; // NOT ALLOWED IN OPENGL ES, CANNOT DO
// INDEXING WITH NONCONSTANT EXPRESSION
}
...
uniform int loopIter;
// NOT ALLOWED IN OPENGL ES, loopIter ITERATION COUNT IS NONCONSTANT
for(int i = 0; i < loopIter; i++)
{
sum += i;
}
11)Uniforms(前辍修改)
Uniform前辍修饰的变量初始值由外部程序赋值。在program中具有统一访问空间,存储空间有限。在Shader中是只读的,只能由外部主机程序传入值。
它用于存储shader需要的各种数据,如:变换矩阵、光照参数和颜色。基本上,对于Shader是一个常量,但在编译时其值未知,则应当作为一个uniform变量。
Uniform变量在Vertex Shader和Fragment Shader之间共享。当使用glUniform***设置了一个uniform变量的值之后,Vertex Shader和Fragment Shader中具有相同的值。
Uniform变量被存储在GPU中的“常量存储区”,其空间大小是固定的,可通过API<glGetIntegerv>查询(GL_MAX_VERTEX_UNIFORM_VECTORS 或 GL_MAX_FRAGMENT_UNIFORM_VECTORS )。
12)Attributes(前辍修改)
Attribute类型的变量只有Vertex Shader才有。Attribute前辍修饰的变量定义的是每个Vertex的属性变量,包括位置,颜色,法线和纹理坐标
Attribute 类型的变量在Vertex Shader中是只读的,只能由外部主机程序传入值。
Attribute 类型的变量:是为每个被正在画的顶点所指定的数据。在画图前,每个顶点的属性由应用程序输入。
与Uniform变量一样,其存储数量也是有限制的。可用glGetIntegerv(GL_MAX_VERTEX_ATTRIBS)进行查询。GPU至少支持8个属性,所以Vertex Shader源码中不要超过8个attributes。
13)Varyings
Varying变量用于存储Vertex Shader的输出和Fragment Shader的输入。在Vertex Shader和Fragment Shader中必须申明同一个Varying变量。
与Uniform和Attribute一样,其存储数量也是有限制的,可用glGetIntegerv(GL_MAX_VARYING_VECTORS)进行查询。GPU至少支持8个Varying vector,所以Vertex Shader源码中不要超过8个Varying vector。
GLint maxVertexAttribs; // n will be >= 8
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
14)预处理
#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
__LINE__ // Replaced with the current line number in a shader
__FILE__ // Always 0 in OpenGL ES 2.0
__VERSION__ // The OpenGL ES shading language version (e.g., 100)
GL_ES // This will be defined for ES shaders to a value of 1
15) Uniform Attribute Varying存储空间最小值
变量类型
GPU必须支持的最小个数
Vertex Uniform Vectors
128
Fragment Uniform Vectors
16
Vertex Attributes
8
Varying Vectors
8
16) 精度限定(Precision Qualifiers)
关键词:lowp highp mediump
(1)指定变量精度(放在数据类型之前):
highp vec4 position;
varying lowp vec4 color;
mediump float specularExp;
(2)指定默认精度(放在Vertex和Fragment shader源码的开始处):
precision highp float;
precision mediump int;
在Vertex Shader中,如果没有默认的精度,则float和int精度都为highp;在Fragment Shader中,float没有默认的精度,所以必须在Fragment Shader中为float指定一个默认精度或为每个float变量指定精度。
17)结果一致性
invariant可被应用于任何Vertex Shader Varying输出变量,其目前是保证相同的操作和相同的输入,其结果一样。因为由于Shader精度不一样,其结果有可能不一样。
uniform mat4 u_viewProjMatrix;
attribute vec4 a_vertex;
invariant gl_Position;
void main
{
// …
gl_Position = u_viewProjMatrix * a_vertex; // Will be the same
// value in all
// shaders with the
// same viewProjMatrix
// and vertex
}
也可指定所有的输出变量都为:invariant
#pragma STDGL invariant(all)
四、获取和设置Uniforms
通过GLint glGetUniformLocation(GLuint program,const char* name).根据一个Uniform的名称获取其location.
通过 glUniform***系列函数可以给一个location 设置一个Uniform的值。
void glUniform1f(GLint location, GLfloat x)
void glUniform1fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform1i(GLint location, GLint x)
void glUniform1iv(GLint location, GLsizei count,const GLint* v)
void glUniform2f(GLint location, GLfloat x, GLfloat y)
void glUniform2fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform2i(GLint location, GLint x, GLint y)
void glUniform2iv(GLint location, GLsizei count,const GLint* v)
void glUniform3f(GLint location, GLfloat x, GLfloat y,GLfloat z)
void glUniform3fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform3i(GLint location, GLint x, GLint y,GLint z)
void glUniform3iv(GLint location, GLsizei count,const GLint* v)
void glUniform4f(GLint location, GLfloat x, GLfloat y,GLfloat z, GLfloat w);
void glUniform4fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform4i(GLint location, GLint x, GLint y,GLint z, GLint w)
void glUniform4iv(GLint location, GLsizei count,const GLint* v)
void glUniformMatrix2fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
void glUniformMatrix3fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
void glUniformMatrix4fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
为矩阵uniform变量设置值的函数中的transpose必须为GL_FALSE,它目的为兼容性,但在 OpenGL ES 2.0中并没有工作。
一旦你设置了一个Program中unifrom变量的值之后,即使你激活了另外一个Program,此uniform的值不变。即uniform变量是Program的局部变量。
五、Vertex Attributes
Vertex属性即顶点数据,它指定了每个顶点的数据。在OpenGL ES1.1中,顶点属性有四个预定义的名字:position(位置), normal(法线), color(颜色), 和 texture coordinates(纹理坐标)。在OpenGL ES2.0中,用户必须定义“顶点属性的名字”。
1. 常量顶点属性(Constant Vertex Attribute)
常量顶点属性对所有顶点都是一样的。因此只需要指定一个值就可以应用于所有顶点。一般很少使用。其设置函数有:
void glVertexAttrib1f(GLuint index, GLfloat x);
void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z,GLfloat w);
void glVertexAttrib1fv(GLuint index, const GLfloat *values);
void glVertexAttrib2fv(GLuint index, const GLfloat *values);
void glVertexAttrib3fv(GLuint index, const GLfloat *values);
void glVertexAttrib4fv(GLuint index, const GLfloat *values);
2. 如何装载顶点数据?(Vertex Arrays)
Vertex Array(顶点数组):是一个存储在应用程序空间(Client)中的内存buffer,它存储了每个顶点的属性数据。
如何把顶点数据组的数据传递给GPU呢?
void glVertexAttribPointer(GLuint index,
GLint size, //每个属性元素个数有效值1-4(x,y,z,w)
GLenum type, //数组中每个元素的数据类型
GLboolean normalized,
GLsizei stride, //如果数据连续存放,则为0或
//size*sizeof(type)
const void *ptr) //顶点数组指针
举例如下:
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f };
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height );
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
// Use the program object
glUseProgram (programObject );
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
2.1 一个顶点的所有属性存储在一起(Array of Structures)
如下图所示,顶点的位置(x,y,z)、法线(x,y,z)和两个纹理坐标(s,t)存储在一起,如下图所示:
2.2 顶点的每个属性单独存储(Structure of Arrays)
http://www.cnblogs.com/sanjin/p/3580331.html
一、本文关注的问题:
• Shader and program 对象介绍
• 创建并编译一个Shader对象
• 创建并链接一个Program对象
• 获取并设置uniforms
• 获取并设置attributes
在OpenGL ES中,每个program对象有且仅有一个Vertex Shader对象和一个Fragment Shader对象连接到它。
Shader:类似于C编译器
Program:类似于C链接器
glLinkProgram操作产生最后的可执行程序,它包含最后可以在硬件上执行的硬件指令。
二、Shader和Program编程概述
1. 创建Shader
1)编写Vertex Shader和Fragment Shader源码。
2)创建两个shader 实例:GLuint glCreateShader(GLenum type);
3)给Shader实例指定源码。 glShaderSource
4)在线编译shaer源码 void glCompileShader(GLuint shader)
2. 创建Program
1)创建program GLuint glCreateProgram(void)
2)绑定shader到program 。 void glAttachShader(GLuint program, GLuint shader)。每个program必须绑定一个Vertex Shader 和一个Fragment Shader。
3)链接program 。 void glLinkProgram(GLuint program)
4)使用porgram 。 void glUseProgram(GLuint program)
对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。
三、 Shading Language中的数据类型与变量
1. Uniforms and Attributes
Uniforms 是一个program 中统一分配的,vertext 和fragment中同名的Uniform必须同类型。对应于不经常变化的变量(用于存储只读常量值的变量)。
Attributes 变化率高的变量。主要用来定义输入的每个点属性。
Uniforms and Attributes 在shader中通过location 和 name 来对应的。
2. 数据类型
1)三类基本数据类型:float , int , boolean
2)复合类型:浮点、整型、布尔向量 vec2 , vec3,vec4。vector访问方式有以下两种:
(1).操作:数学{x, y, z, w}, 颜色{r, g, b, a}或 纹理坐标{s, t, r, q},但不能混用,举例如下:
vec3 myVec3 = vec3(0.0, 1.0, 2.0); // myVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp = myVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp = myVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp = myVec3.zyx; // temp = {2.0, 1.0, 0.0}
(2)[ ]操作:[0]对应x,[1]对应y,[2]对应z,[3]对应w。[ ]中只能为常量或uniform变量,不能为整数量变量(如:i,j,k)。
3)矩阵:mat2, mat3,mat4 (按列顺序存储)
mat3 myMat3 = mat3(1.0, 0.0, 0.0, // 第一列
0.0, 1.0, 0.0, // 第二列
0.5, 1.0, 1.0); // 第三列
可用[ ]或.操作符来访问:
mat4 myMat4 = mat4(1.0); // Initialize diagonal to 1.0 (identity)
vec4 col0 = myMat4[0]; // Get col0 vector out of the matrix
float m1_1 = myMat4[1][1]; // Get element at [1][1] in matrix
float m2_2 = myMat4[2].z; // Get element at [2][2] in matrix
4)常量
const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);
5)结构体: 用基本类型和复合类型构建结构体。
struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
fogVar = fogStruct(vec4(0.0, 1.0, 0.0, 0.0), // color
0.5, // start
2.0); // end
vec4 color = fogVar.color;
float start = fogVar.start;
float end = fogVar.end;
6)数组:类似于C语言,索引从0开始。在创建时不能被初始化,索引只能为常量或uniform变量。
float floatArray[4];
vec4 vecArray[2];
7)操作
支持的操作有:*,/,+,-,++,--,=,+=, -=, *=, /=,==, !=, <, >, <=, >=,&&,^^,||
float myFloat;
vec4 myVec4;
mat4 myMat4;
myVec4 = myVec4 * myFloat; // Multiplies each component of myVec4
// by a scalar myFloat
myVec4 = myVec4 * myVec4; // Multiplies each component of myVec4
// together (e.g., myVec4 ^ 2 )
myVec4 = myMat4 * myVec4; // Does a matrix * vector multiply of
// myMat4 * myVec4
myMat4 = myMat4 * myMat4; // Does a matrix * matrix multiply of
// myMat4 * myMat4
myMat4 = myMat4 * myFloat; // Multiplies each matrix component by
// the scalar myFloat
前面矩阵的行数就是结果矩阵的行数,后面矩阵的列数就是结果矩阵的列数。
8)自定义函数:
vec4 myFunc(inout float myFloat, // inout parameter
out vec4 myVec4, // out parameter
mat4 myMat4); // in parameter (default)
函数不能递归调用,因为GPU不一定有Stack和流控。
9)Shading Language内嵌函数
主要有以下几类函数:
(1)角度和三角函数
(2)指数函数
(3)通用函数(绝对值、取整、取余、取小数部分等)
(4)几何函数
(5)矩阵函数
(6)向量比较函数
(7)纹理查找函数
(8)Derivative函数
10)控制流
if(color.a < 0.25)
{
color *= color.a;
}
else
{
color = vec4(0.0);
}
//For循环。只支持常数循环次数。
//无论下标,还是循环变量,都只能使用编译时可确定的常数。
for(int i = 0; i < 3; i++)
{
sum += i;
}
以下不允许(因为下标为变量或loop次数为变量):
float myArr[4];
for(int i = 0; i < 3; i++)
{
sum += myArr[i]; // NOT ALLOWED IN OPENGL ES, CANNOT DO
// INDEXING WITH NONCONSTANT EXPRESSION
}
...
uniform int loopIter;
// NOT ALLOWED IN OPENGL ES, loopIter ITERATION COUNT IS NONCONSTANT
for(int i = 0; i < loopIter; i++)
{
sum += i;
}
11)Uniforms(前辍修改)
Uniform前辍修饰的变量初始值由外部程序赋值。在program中具有统一访问空间,存储空间有限。在Shader中是只读的,只能由外部主机程序传入值。
它用于存储shader需要的各种数据,如:变换矩阵、光照参数和颜色。基本上,对于Shader是一个常量,但在编译时其值未知,则应当作为一个uniform变量。
Uniform变量在Vertex Shader和Fragment Shader之间共享。当使用glUniform***设置了一个uniform变量的值之后,Vertex Shader和Fragment Shader中具有相同的值。
Uniform变量被存储在GPU中的“常量存储区”,其空间大小是固定的,可通过API<glGetIntegerv>查询(GL_MAX_VERTEX_UNIFORM_VECTORS 或 GL_MAX_FRAGMENT_UNIFORM_VECTORS )。
12)Attributes(前辍修改)
Attribute类型的变量只有Vertex Shader才有。Attribute前辍修饰的变量定义的是每个Vertex的属性变量,包括位置,颜色,法线和纹理坐标
Attribute 类型的变量在Vertex Shader中是只读的,只能由外部主机程序传入值。
Attribute 类型的变量:是为每个被正在画的顶点所指定的数据。在画图前,每个顶点的属性由应用程序输入。
与Uniform变量一样,其存储数量也是有限制的。可用glGetIntegerv(GL_MAX_VERTEX_ATTRIBS)进行查询。GPU至少支持8个属性,所以Vertex Shader源码中不要超过8个attributes。
13)Varyings
Varying变量用于存储Vertex Shader的输出和Fragment Shader的输入。在Vertex Shader和Fragment Shader中必须申明同一个Varying变量。
与Uniform和Attribute一样,其存储数量也是有限制的,可用glGetIntegerv(GL_MAX_VARYING_VECTORS)进行查询。GPU至少支持8个Varying vector,所以Vertex Shader源码中不要超过8个Varying vector。
GLint maxVertexAttribs; // n will be >= 8
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
14)预处理
#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
__LINE__ // Replaced with the current line number in a shader
__FILE__ // Always 0 in OpenGL ES 2.0
__VERSION__ // The OpenGL ES shading language version (e.g., 100)
GL_ES // This will be defined for ES shaders to a value of 1
15) Uniform Attribute Varying存储空间最小值
变量类型
GPU必须支持的最小个数
Vertex Uniform Vectors
128
Fragment Uniform Vectors
16
Vertex Attributes
8
Varying Vectors
8
16) 精度限定(Precision Qualifiers)
关键词:lowp highp mediump
(1)指定变量精度(放在数据类型之前):
highp vec4 position;
varying lowp vec4 color;
mediump float specularExp;
(2)指定默认精度(放在Vertex和Fragment shader源码的开始处):
precision highp float;
precision mediump int;
在Vertex Shader中,如果没有默认的精度,则float和int精度都为highp;在Fragment Shader中,float没有默认的精度,所以必须在Fragment Shader中为float指定一个默认精度或为每个float变量指定精度。
17)结果一致性
invariant可被应用于任何Vertex Shader Varying输出变量,其目前是保证相同的操作和相同的输入,其结果一样。因为由于Shader精度不一样,其结果有可能不一样。
uniform mat4 u_viewProjMatrix;
attribute vec4 a_vertex;
invariant gl_Position;
void main
{
// …
gl_Position = u_viewProjMatrix * a_vertex; // Will be the same
// value in all
// shaders with the
// same viewProjMatrix
// and vertex
}
也可指定所有的输出变量都为:invariant
#pragma STDGL invariant(all)
四、获取和设置Uniforms
通过GLint glGetUniformLocation(GLuint program,const char* name).根据一个Uniform的名称获取其location.
通过 glUniform***系列函数可以给一个location 设置一个Uniform的值。
void glUniform1f(GLint location, GLfloat x)
void glUniform1fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform1i(GLint location, GLint x)
void glUniform1iv(GLint location, GLsizei count,const GLint* v)
void glUniform2f(GLint location, GLfloat x, GLfloat y)
void glUniform2fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform2i(GLint location, GLint x, GLint y)
void glUniform2iv(GLint location, GLsizei count,const GLint* v)
void glUniform3f(GLint location, GLfloat x, GLfloat y,GLfloat z)
void glUniform3fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform3i(GLint location, GLint x, GLint y,GLint z)
void glUniform3iv(GLint location, GLsizei count,const GLint* v)
void glUniform4f(GLint location, GLfloat x, GLfloat y,GLfloat z, GLfloat w);
void glUniform4fv(GLint location, GLsizei count,const GLfloat* v)
void glUniform4i(GLint location, GLint x, GLint y,GLint z, GLint w)
void glUniform4iv(GLint location, GLsizei count,const GLint* v)
void glUniformMatrix2fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
void glUniformMatrix3fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
void glUniformMatrix4fv(GLint location, GLsizei count,
GLboolean transpose,const GLfloat* value)
为矩阵uniform变量设置值的函数中的transpose必须为GL_FALSE,它目的为兼容性,但在 OpenGL ES 2.0中并没有工作。
一旦你设置了一个Program中unifrom变量的值之后,即使你激活了另外一个Program,此uniform的值不变。即uniform变量是Program的局部变量。
五、Vertex Attributes
Vertex属性即顶点数据,它指定了每个顶点的数据。在OpenGL ES1.1中,顶点属性有四个预定义的名字:position(位置), normal(法线), color(颜色), 和 texture coordinates(纹理坐标)。在OpenGL ES2.0中,用户必须定义“顶点属性的名字”。
1. 常量顶点属性(Constant Vertex Attribute)
常量顶点属性对所有顶点都是一样的。因此只需要指定一个值就可以应用于所有顶点。一般很少使用。其设置函数有:
void glVertexAttrib1f(GLuint index, GLfloat x);
void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z,GLfloat w);
void glVertexAttrib1fv(GLuint index, const GLfloat *values);
void glVertexAttrib2fv(GLuint index, const GLfloat *values);
void glVertexAttrib3fv(GLuint index, const GLfloat *values);
void glVertexAttrib4fv(GLuint index, const GLfloat *values);
2. 如何装载顶点数据?(Vertex Arrays)
Vertex Array(顶点数组):是一个存储在应用程序空间(Client)中的内存buffer,它存储了每个顶点的属性数据。
如何把顶点数据组的数据传递给GPU呢?
void glVertexAttribPointer(GLuint index,
GLint size, //每个属性元素个数有效值1-4(x,y,z,w)
GLenum type, //数组中每个元素的数据类型
GLboolean normalized,
GLsizei stride, //如果数据连续存放,则为0或
//size*sizeof(type)
const void *ptr) //顶点数组指针
举例如下:
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f };
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height );
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
// Use the program object
glUseProgram (programObject );
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
2.1 一个顶点的所有属性存储在一起(Array of Structures)
如下图所示,顶点的位置(x,y,z)、法线(x,y,z)和两个纹理坐标(s,t)存储在一起,如下图所示:
2.2 顶点的每个属性单独存储(Structure of Arrays)
发表评论
-
indexedDB存图片减少请求
2020-05-21 19:23 568getImageFile()获取网络图片 showImage ... -
vizceral-example的例子
2020-03-19 18:53 365自定义图和加载结构 代码在 https://github.c ... -
jsonpath的helloworld
2020-03-17 14:58 421基本语法:https://www.cnblogs.com/jp ... -
流动图神器vizceral
2019-10-12 19:04 542把c的代码生成json:https://github.com/ ... -
emscripten asm.js的helloworld
2018-03-01 20:15 1126mac下安装: brew install SDL2 SDL2_ ... -
websocket上传文件
2016-12-15 13:30 4506nginx的上传 查看http://haoningabc.it ... -
webpack的helloworld
2016-11-02 10:42 918参考 http://www.jianshu.com/p/42e ... -
iphone6等移动端的css自适应
2016-10-17 01:18 1220参考 http://jingyan.baidu.com/art ... -
javascript自定义事件
2016-06-01 21:49 560一言不合上代码 <input value=" ... -
html5的fiesystem api 浏览器本地存储
2016-06-01 15:59 929html5的fiesystem api可以存取本地文件 一言不 ... -
websocket传传图片
2015-12-25 17:51 7252参考[url]http://www.adobe.com/dev ... -
angularjs使用include后双向绑定失败的解决
2015-12-20 19:41 1875原理参考 http://segmentfault.com/q/ ... -
html5 陀螺仪
2014-11-26 21:05 5891<html> <head> ... -
webgl的贝塞尔曲线
2014-11-12 00:56 2546BezierCurve webgl的贝塞尔曲线 webgl ... -
chrome app的helloworld
2014-11-11 13:56 726参考 http://blog.csdn.net/rydiy/a ... -
javascript对象转json
2014-10-17 14:09 1018<html> <head>& ... -
jquery 的svg中国地图
2012-12-16 14:37 28109三种吧 1.d3.js很强大 2.jquery的 jvecto ... -
纯css的树型结构
2012-10-03 18:29 1291<html><head> ... -
D3 的3d图
2012-09-16 17:05 1467LCF http://mathworld.wolfram. ... -
jquery table拖拽排序
2012-07-14 21:45 7133参考http://dragsort.codeplex.com/ ...
相关推荐
Unity内置Shader,也被称为built-in-shaders,是Unity引擎的核心组成...通过深入研究这些Shader,不仅可以掌握图形学的基本概念,还能学会如何在实际项目中应用它们,从而创作出更具视觉吸引力和性能效率的游戏和应用。
"Unity Shader实现流光效果Shader-FlowEffect-master.zip"是一个包含资源的压缩包,专门用于创建流光效果。流光效果,通常在科幻或者奇幻场景中常见,可以为游戏或应用增加动态感和视觉吸引力。以下将详细讲解Unity...
1. **ShaderForge的基本概念**: - **Shader**: 在计算机图形学中,Shader是运行在GPU上的小程序,用于控制如何渲染场景中的物体。Unity中的Shader可以改变光照、纹理、颜色等视觉元素。 - **节点系统**: Shader ...
Brute Force - Grass Shader 1.9 (7-7-2023)
因此,本系列教程旨在为初学者提供一个系统的 Shader 入门指南,从基本概念到实际应用,逐步深入。 Shader 是什么? ------------- Shader 是一个小段程序,它负责将输入的 Mesh 以指定的方式和输入的贴图或者颜色...
我将把最热门的着色器从shadertoy转换为Universal SRP着色器。我会尝试经常更新;因此,请观看并支持我,以获取更多信息:) 执照 如您所知,sharttoy项目已获得请查看每个着色器代码是否具有另一个许可证。否则,必须...
在本压缩包“vertex-shader-program-matlab.rar_SHADER_matlab_vertex_color”中,我们聚焦于使用MATLAB实现的顶点着色器(Vertex Shader)。MATLAB作为一个强大的数值计算和可视化工具,虽然在游戏开发或专业图形...
### Shader编程概述 在计算机图形学领域,Shader(着色器)是一种小型程序,用于处理图形数据,并将处理结果应用于网格或模型上。通过Shader,我们可以实现从简单的颜色变化到复杂的光照效果等各种视觉表现。Shader...
节点式的编辑器,类似UE的蓝图编辑器,可视化编程比较直观,暴露参数简单。 有一句话叫做:黑透白不透。 利用黑底贴图做底,其他部件使用白色,Shader透明类型选择Additive,即可完美剔除黑色部分。
shader学习资料
此外,作者还可能会介绍Vertex Shader和Pixel Shader的基本概念及其在图形管线中的作用。 **第2章:开始** - **DirectX版本检查**:在开始编程之前,确保系统支持所需的DirectX版本是非常重要的。这一节可能介绍了...
首先,我们要了解Shader的基本概念。Shader是一种程序,运行在GPU(图形处理器)上,用于控制场景中的物体如何显示。Unity3D内置的Shader覆盖了各种常见效果,如基本的颜色混合、光照、纹理映射等。通过查看和分析...
### Shader编程教程知识点详解 #### 一、Shader简介与历史沿革 - **Shader概念**:Shader是一种专门用于图形处理的程序,它...通过本教程的学习,希望能够帮助初学者快速入门并掌握Shader编程的基本方法和技术要点。
本资源“浅墨大神shader-Unity-Shader-master.zip”是一个专注于Unity Shader学习的资料包,由知名开发者浅墨(QianMo)提供。浅墨在Unity社区以其深入浅出的教程和高质量的Shader作品闻名,他的教程深受初学者和...
-- 在shader forge和amplyfy Shader节点图形化shader编程的诱惑下,unity官方终于在2018版本也推出了而自己shader节点可视化编程工具Shaderr Graph。本篇文章是对Shader Graph一些效果的尝试,建议学习shader的朋友...
- **Shader编程**:着色器是3D游戏中实现复杂视觉效果的关键技术。书中详细讲解了不同类型的着色器及其编写方法,如顶点着色器、片段着色器等。 #### 五、高级主题与技术 除了基础知识外,《游戏编程图书全集-3D》...
After the tremendous success of Direct3D ShaderX: Vertex and Pixel Shader Tips and Tricks, I planned to do another book with an entirely new set of innovative ideas, techniques, and algorithms...
### XNA Shader编程知识点概述 #### 一、XNA与HLSL简介 - **XNA**: 微软推出的一款游戏开发...本文档提供了从基础知识到具体应用场景的全面指南,帮助读者快速入门并深入了解XNA Shader编程的核心概念和技术细节。
"浅陌-Unity-Shader-master.zip"是一个包含Unity Shader教程或者资源的压缩包,适用于对Unity Shader感兴趣或者正在学习的同学。 在Unity中,Shader主要通过两种语言编写:CG语言(基于C语言)和Unity自己的Surface...
- 一个完整的Shader程序通常包括输入、输出变量、计算过程等部分,需要理解变量声明、控制流语句、函数定义等基本概念。 11. **状态机管理(State Management)** - 在Shader的上下文中,需要管理各种渲染状态,...