分类存档: opengl

opengles中使用顶点数组

static GLfloat triangles[]={0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0};
static GLfloat triangles2[]={-1.0,-1.0,0.0, 0.0,0.0,0.0,-1.0,0.0,0.0};
void renderFrame() {
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClearColor(0.0f,1.0f,1.0f,1.0f);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,triangles);
glDrawArrays(GL_TRIANGLES,0,3);
glVertexPointer(3,GL_FLOAT,0,triangles2);
glDrawArrays(GL_TRIANGLES,0,3);
}

Opengl五 纹理

1加载纹理

glTexImage(GLenum target,GLint level,GLint internalFormat,GLsizei width,GLint border,GLenum format,GLenum type,void * data);

参数:

target: GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D

level:指定这些函数所加载的mipmap层,对于非mipmap纹理,此值可以设置为0

internalFormat : 告诉opengl每个纹理单元中存储多少颜色成分,一些常用值:GL_ALPHA,GL_LUMINANCE,GL_LUMINANCE_ALPHA,GL_RGB,GL_RGBA

width,height,depth:指定了纹理的宽度,高度和深度(这三个值推荐强制使用2的次数)

border:纹理贴图的边界宽度

format : 在内存中的格式

type : data数据的类型int,byte,short等

data:纹理数据

纹理替换:

glTextureSubImage : 替换纹理比重新加载一个新纹理速度更快

纹理对象允许我们一次加载多个纹理(放在内存中)。

1、glGenTexutres(GLsizei n,GLuint *textureIds) ; 分配纹理对象

2、glBindTexture(GLenum target,GLuint texture); 绑定纹理对象,以后操作使用此纹理

3、glDeleteTexture(GLsizei n, GLuint *textureIds);  删除纹理对象

 

以下是具体伪代码

glGenTexutreids

glBindTexture

glTexParameterf(GL_Texture_2D,GL_TEXUTRE_MIN_FILETER,GL_LINEAR);

glTexParamterf(GL_Texture_2D,GL_texture_mag_filter,GL_LINEAR);

glEnable(GL_TEXUTRE_2D)

glTexCoord3f

glVertex3f

 

Opengl四雾

glEnable(GL_FOG); // 打开雾

glFogfv(GL_FOG_COLOR,float[])// 设置雾颜色,通常和背景色一致

glFogf(GL_FOG_START,5f) // 雾从多远开始

glFlogf(GL_FOG_END,30f) // 雾从多远停止

glFog(GL_FOG_MODE,GL_LINEAR) // 使用哪种雾方程式

 

OpengGL 三

颜色来材质

glEnable(GL_BLEND);// 启用混色

启用抗锯齿:

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_POINT_SMOOTH);

glEnable(GL_LINE_SMOOTH);

glEnable(GL_POLYGON_SMOOTH);

混合平滑处理,作用于点和线效果非常好,对于多边形,使用多重采样效果会更好。

多重采样被启用时,平滑特性会被忽略。

Opengl二

光源:

环境光:ambient

散射光:diffuse

镜面光:specular

启动光源:glEnable(GL_LIGHTING);

设置光源模式:

glLightModefv(GL_LIGHT_MODEL_AMBIENT,ambientLight);

设置材质光照属性

glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,float[]);

GL_FRONT:设置正面光照属性

GL_FRONT_BACK

GL_FRONT_AND_BACK

opengl宝典中推荐使用另一种方法设置光照:

glEnable(GL_COLOR_MATERICAL); // 设置颜色追踪

glColorMaterical(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

 

设置光源:

glLight(GL_LIGHT0,GL_AMBIENT,float[]);

glLight(GL_LIGHT0,GL_DIFFUSE,float[]);

glEnable(GL_LIGHT0);

 

OpenGL一

OpenGL分为投影矩阵及模型视图矩阵。

OpenGL多边形默认逆时针方向环绕是多边形的正面。

OpenGL图元:

GL_POINTS : 点

GL_LINES : 线  (如果指定了奇数个点,直接忽略最后一个点)

GL_LINE_STRIP : 线带

GL_LINE_LOOP : 线环

GL_TRIANGLES : 三角形

GL_TRIANGLE_STRIP : 三角形带

GL_TRIANGLE_FAN : 三角形扇

GL_QUADS : 四边形

GL_QUAD_STRIP : 四边形带

GL_POLYGON : 多边形

多边形颜色:

GL_FLAT : 使用多边形最后一个顶点的颜色填充多边形

GL_SMOOTH : 根据顶点的颜色进行渐变,对相邻顶点的颜色进行匀和

openGL显示列表有两种模式

opengl两咱显示模式:

GL_COMPILE与GL_COMPILE_AND_EXECUTE

需要注意一下测试两种模式带来的性能变化。

插值

以下插值算法参考自wmo,可能有优化余地

 

线性插值:

r(取值范围 0~1)

v1、v2

v1 * ( 1f – r) + v2 * r

 

埃尔米特插值:

r、v1、v2、in、out

h1= 2f * r * r * r – 3f  * r * r +1f

h2= -2f * r * r * r + 3f  * r * r

h3= r * r * r – 2f * r * r + r

h4= r * r * r – r * r

v1 * h1 + v2 * h2 + in * h3 + out * h4

贝赛尔曲线插值:

r、v1、v2、in、out

inverseFactor = 1f – r

factorTimesTwo = r * r

inverseFactorTimesTwo = inverseFactor * inverseFactor

 

h1 = inverseFactorTimesTwo * inverseFactor

h2 = 3f * r * inverseFactorTimesTwo;

h3 = 3f * factorTimesTwo * inverseFactor;

h4 = factorTimesTwo * r

v1 * h1 + v2 * h2 + in * h3 + out * h4

 

四元数线性插值默认使用slerp函数