OpenGL ES 学习难点日志

对照《OpenGL ES应用开发实践指南(Android卷)》
记录所犯错误

2017-03-16 glsl文件

在编写 着色器(.glsl文件)是一种类似C语言的代码
编写中注意分号(;)
如:

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main()
{
    v_Color = a_Color;

    gl_Position = a_Position;
    gl_PointSize = 10.0;
}

由于缺少“gl_PointSize = 10.0;”中的结尾分号,
编译没有问题,
但执行时只有最开始
glClearColor (float red, float green, float blue, float alpha)
执行时所呈现出来的RGB(red,green,blue)颜色

OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器),有时还会有Geometry Shader(几何着色器)。负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL 中的状态,GLSL内置变量进行传递。GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。

顶点着色器主要的工作是:
1. 利用视图和投影矩阵对点的位置进行变化
2. 如果需要利用法线的时候,也同样需要利用视图矩阵对其进行转换
3. 纹理坐标的产生和转换
4. 顶点的光照或者象素光照的计算
5. 颜色计算

并不是所有的工作都需要做,只需根据自己的需要进行不同的编写。负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL中的状态,GLSL内置变量进行传递。比如gl_ProjectionMatrix(投影变换矩)、gl_ModelViewMatrix(视图变换矩阵)、gl_Vertex、gl_Color、gl_Frontcolor、gl_Normal等;而这些又是根据OpenGL应用程序传递诸如顶点位置、颜色、法线等信息。


2017-03-18 别忘了每次都要执行glEnableVertexAttribArray(int index)

在如下代码中:

// 以下代码读取了顶点(vertex)对应的位置
vertexData.position(0);
glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GL_FLOAT, false, STRIDE, vertexData);
glEnableVertexAttribArray(aPositionLocation);

// 以下代码读取了顶点(vertex)对应的颜色
vertexData.position(POSITION_COMPONENT_COUNT);
glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT, GL_FLOAT, false, STRIDE, vertexData);
glEnableVertexAttribArray(aColorLocation);

三个函数执行了各执行了两边

vertexData.position(int index)

vertexData 为存储 位置、颜色 数据的数据,position() 的作用就是将读取位置对应到相应位置

void glVertexAttribPointer (int indx, 
                int size, 
                int type, 
                boolean normalized, 
                int stride, 
                Buffer ptr)

将着色器(.glsl文件)中所定义的属性(attribute)对应起来

glEnableVertexAttribArray(int index);

对应完成后,就要将相应效果进行使能操作(enable)

三者是要绑定存在的,需要每次各出现一次!!!


2017-03-19 正交投影

如下矩阵中:

100001000010xtranslationytranslationztranslation1

某向量{x, y, z, w}做成上述矩阵即可分别
x 方向平移 xtranslation 个单位,
y 方向平移 ytranslation 个单位,
z 方向平移 ztranslation 个单位

而对于函数

orthoM(float[] m, int mOffset, float left, float right, float bottom, float top, float near, float far)

float[] m : 目标数组, 这个数组的长度至少有16个元素,这样它才能存储正交投影矩阵;
int mOffset : 结果矩阵起始的偏移值;
float left : x轴的最小范围;
float right : x轴的最大范围;
float bottom : y轴的最小范围;
float top : y轴的最大范围;
float near : z轴的最小范围;
float far : z轴的最大范围。

该函数会产生如下的正交投影矩阵:

2rightleft00002topbottom00002farnear0right+leftrightlefttop+bottomtopbottomfar+nearfarnear1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值