OpenGL ES(Java)

原文链接 :

https://developer.android.google.cn/guide/topics/graphics/opengl.html

在ES1.0API中 你可以申请投影矩阵和相机试图通过创建每一个矩阵然后添加他们到环境中。
1.投影矩阵:
使用设备屏幕创建投影矩阵为的是创建重新计算对象坐标,因此对象以正确的比例被画出来。下面的示例代码证明如何修改GLSurfaceView.Randerer中onSurfaceChanged()方法来创建基于屏幕比率的投影矩阵及将他申请到OpenGL渲染环境中。

public void onSurfaceChanged(GL10 gl,int width,int height){
gl.glViewport(0,0,width,height);
float radio = (float)width/height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio,ratio,-1,1,3,7);
}

2.相机转换矩阵
一旦你使用投影矩阵调整坐标系统,你必须使用相机视图。相仿的示例代码显示了如何修改GLSurfaceView.Renderer的onDrawFrame()方法的实现来使用模型视图并且使用GLU.gluLookAt()用来模拟相机位置来创建视图转换。

public void onDrawFrame(GL10 gl){
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIndentity();
GLU.gluLookAt(gl,0,0,-5,0,0,0,0,1,0);
}

投影和相机视图在OpenGL ES2.0或更高版本
在ES2.0和3.0API中,你通过首先添加一个矩阵成员到顶点着色器中来使用投影矩阵与相机视图。矩阵成员被添加后,一颗依然然后生成并且应用投影和相机试图矩阵到你的对象。

1.添加矩阵到顶点着色器
创建一个变量用于视图投影矩阵并且包括它作为着色器位置因子,在下例的顶点着色代码中,包括的成员uMVPMatrix 成员允许你使用投影矩阵和相机视觉矩阵到对象的坐标。

注:上面的示例定义了一个转换矩阵成员在顶点着色器中,在中使用一个结合的投影矩阵和相机试图矩阵依照你的应用需要,你可能需要定义分离的投影矩阵和相机视图矩阵在顶点着色器中,因此可以独立更改他们。

2.获取着色器矩阵
在创建一个顶点着色器来应用投影矩阵和相机视图,你可以获取变量来是用投影和相机视图矩阵。下面的代码显示如何修改GLSurfaceView.Renderer的onSurfaceCreated()方法来获取定义在着色器中的矩阵变量

public void onSurfaceCreated(GL10 unused,EGLConfig){
muMVPMatrixHandle = GLES20.glGetUniformLocation(mPrograrm,"uMVPMatrix");
}

3.创建投影和相机视图矩阵
生成投影和试图矩阵开应用几何对象。下方的例子显示如何修改GLSurfaceView.Renderer的onSurfaceCreated()andonSurfaceChanged()方法来创建相机视图矩阵和投影矩阵基于设备屏幕比例。

public void onSurfaceCreated(GL20 unused,EGLConfig config){
Matrix.setLookAtM(mVMatrix,000,-3000010);
}

pubic void onSurfaceChanged(GL10 unused,int width ,int height){
GLES20.glViewport(0,0,width,height);
float ratio = (float)width/height;
Matrix.frustuM(mProjMatrix,0,-ratio,ratio,-1,1,3,7);
}

4.应用投影和相机投影矩阵
为了使用投影和相机矩阵转换,将矩阵乘在一起然后设置他们到顶点着色器。下方的例子显示如何修改GLSurfaceView.Renderer中onDrawFrame()方法实现来结合在上方创建的投影矩阵和相机视图矩阵并且然后使用它们来渲染OpenGL。

public void onDrawFrame(GL10 unused){
Matrix.multiplyMM(mMVPMatrix,0,mProjMatrix,0,mVMatrix,0);
GLES20.glUniformMatrix4fv(muMVPMatrixHandle,1,false,mMVPMatrix,0);
}

形状面和弯曲
在OpenGL中,形状面是一个在三维空间中由3或更多个点组成的表面。一系列三或更多个三维点有一个前面和一个后面。你怎么知道哪个面是前面,哪个面是后面?答案是通过旋转决定或者方向由形状点决定。
在这个例子中,三角形的点以一个顺时针方向定义。这些坐标被画的顺序定义了形状的旋转放向。默认的,在OpenGL中,逆时针面是正面。
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值