Opengles2.0入门「建议收藏」

Opengles2.0入门「建议收藏」一二三四Opengles2.0渲染管线简单画图步骤着色器语言简单介绍镜像技术一OpenGLES2.0渲染管线1.基本处理初始化3D空间中物体的顶点坐标,顶点对应的颜色,顶点的纹

大家好,又见面了,我是你们的朋友全栈君。

一 二 三 四 Opengles2.0渲染管线 简单画图步骤 着色器语言简单介绍 镜像技术

一 OpenGLES2.0渲染管线
1.基本处理
初始化3D空间中物体的 顶点坐标,顶点对应的颜色,顶点的纹理坐标等属性 1.1 顶点缓冲对象(可选):缓冲顶点数据,提高渲染效率

2.顶点着色器:

顶点变换,法向量计算,纹理坐标变换,光照与材质的应用 3.图元装配
3.1 图元组装:组装点,线,三角形 3.2 图元处理:主要是裁剪

4.光栅化:将投影结果离散化为一个个小片元 5.片元着色器:纹理处理,颜色求和,雾效果 6.剪裁测试:丢弃在帧缓冲位置不在剪裁窗口中的片元 7.深度测试与模板测试:
深度测试就是判断新片元的深度是否小于深度缓冲区里面的片元深度,小于则能通过 深度测试,否则新片元将被丢弃。 深度就是指物体距照相机的位置,深度缓冲区的片元深度,是指第一个被绘制的物体 的片元深度,新的通过深度测试的片元,将会成为深度缓冲区的片元深度。 镜像技术一定要关闭深度检测。

8.颜色缓冲混合 9.抖动 10.帧缓冲

二 简单绘图步骤
绘制一个用户可以旋转的三角形的步骤如下: 1.用 GLSurfaceView and GLSurfaceView.Render创建一个Activity,为 GLSurfaceView子类增加onTouchEvent事件 2.初始化顶点坐标,颜色坐标并缓冲坐标数据 3.编写顶点着色器,片元着色器语言并加载,编译顶点,片元shader 4.创建着色器程序,并关联shader 5.产生摄像机9参数位置矩阵 6.产生透视投影矩阵 7.产生最终的模型视图投影矩阵,绘制三角形

步骤二:初始化顶点坐标,颜色坐标并缓冲坐标数据 顶点坐标 float triangleCoords[] = { // X, Y, Z -1.0f, 1.0f, 0.0f, // 0, Top Left -1.0f, -1.0f, 0.0f, // 1, Bottom Left 1.0f, -1.0f, 0.0f, // 2, Bottom Right 1.0f, 1.0f, 0.0f, // 3, Top Right }; ByteBuffer vbb = ByteBuffer.allocateDirect( vbb.order(ByteOrder.nativeOrder()); FloatBuffer triangleVB = vbb.asFloatBuffer(); ByteBuffer triangleVB.put(triangleCoords); triangleVB.position(0);

步骤三:编写顶点着色器,片元着色器语言并加载,编译顶点,片元shader ? private final String vertexShaderCode = ? // This matrix member variable provides a hook to manipulate ? // the coordinates of the objects that use this vertex shader ? “uniform mat4 uMVPMatrix; \n” + ? “attribute vec4 aColor;\n” + ? “varying vec4 vColor;\n” + ? “attribute vec4 vPosition; \n” + ? “void main(){ \n” + ? // the matrix must be included as a modifier of gl_Position ? ” gl_Position = uMVPMatrix * vPosition; \n” + ? ” vColor = aColor;\n” + ? “} \n”; ? ? private final String fragmentShaderCode = ? “precision mediump float; \n” + ? “varying vec4 vColor;\n” + ? “void main(){ \n” + ? ” gl_FragColor = vColor; \n” + ? “} \n”;

步骤四:创建着色器程序,并关联shader
mProgram = GLES20.glCreateProgram(); GLES20.glAttachShader(mProgram, vertexShader GLES20.glAttachShader(mProgram, fragmentShader); GLES20.glLinkProgram(mProgram); // 从OpenGLES引擎里面获取vPosition属性的句柄,便于下面赋值 maPositionHandle = GLES20.glGetAttribLocation(mProgram, “vPosition”); // 从OpenGLES引擎里面获取aColor属性的句柄,便于下面赋值 maColorHandle = GLES20.glGetAttribLocation(mProgram, “aColor”);

步骤五:产生摄像机9参数位置矩阵 Matrix.setLookAtM(mVMatrix, 0, 0f, 0f, 7f, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f);

步骤五:产生透视投影矩阵
//为投影矩阵赋值,ratio为设备屏幕的宽高比, Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); //获取最终的模型视图投影矩阵uMVPMatrix的句柄, muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, “uMVPMatrix”);

视景体的如下:

步骤七:产生最终的模型视图投影矩阵,绘制三角形
public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); // 重 绘背景色 GLES20.glUseProgram(mProgram);//把着色器程序添加到OpenGL环境中 // 将顶点数据缓冲里面的数据赋值给opengl引擎里面的顶点位置句柄 GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, triangleVB); GLES20.glEnableVertexAttribArray(maPositionHandle);//启用该顶点位置属性 // 将颜色缓冲数据赋值给引擎的颜色句柄 GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false, 16, colorBuffer); GLES20.glEnableVertexAttribArray(maColorHandle);//启用该顶点颜色位置属性 //根据模型旋转角度为模型矩阵赋值 Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f); //将模型矩阵和视图矩阵合并为一个矩阵 Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0); //再和投影矩阵合并,最终形成模型视图投影矩阵 Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);、 //绘制三角形 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3); }

三 着色器语言简单介绍
OpenGL ES着色语言时一种高级的过程语言,基于C/C++语言。 数据类型: 向量:由同样类型的标量组成,标量为bool,int,float。每个向量可以有2个,3个或者4 个相同的标量组成。例如: Vec4:包含了四个浮点数的向量 ivec2:包含了两个整数的向量 矩阵:3D场景中物体的移位,旋转,缩放等变换都是有矩阵的运算来实现的。 例如:Mat2:2×2的浮点矩阵 mat4:4×4的浮点矩阵 限定符: Attribute:一般用于每个顶点都不相同的量,如顶点坐标,颜色,纹理坐标,法向量等 该限定符只用于顶点着色器。 Uniform:一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的量,如当前的 光源位置。该限定符可用于顶点着色器和片元着色器。 Varying:用于从顶点着色器传递到片元着色器的量。 内建变量: 顶点着色器的内建输出变量: gl_Position:在顶点着色器里面为其赋值后,该变量传递到渲染管线供后续处理。 片元着色器的内建输出变量: gl_FragColor:在片元着色器里面为其赋值后,该变量传递到渲染管线供后续处理。

四 镜像技术

形成镜像的原因是反射,经过反射形成的像与其对应的实体相对于反射面是对称 的,因此可以根据实体和反射面的位置计算出镜像的位置。

镜像效果的绘制顺序最好为:首先绘制反射面,其次绘制镜像体,最后绘制实体。 最关键的就是要关闭深度测试。 在打开深度测试后,会开不见镜像体的原因: 如果先绘制里照相机较近的反射面,则此时在深度缓冲区里面会记录较小的深度 值,当绘制里照相机较远的镜像体时,因为其片元的深度值大于此时缓冲区 里面的值,于是将不会通过深度测试,片元将被丢弃。 如果先绘制镜像体然后绘制反射面的话,深度测试能够通过,但是反射面过大会 覆盖镜像体的片元,导致镜像体被部分或全部遮挡。

关闭深度测试后,也要先绘制反射面,再绘制镜像体,此时在混色时镜像体能够 可见,否则,反射面将完全遮挡镜像体。
对于实体的绘制最好放在最后,具体原因有待考证。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154856.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月1日 上午6:36
下一篇 2022年7月1日 上午6:46


相关推荐

  • python删除文件指定行

    python删除文件指定行我们现在有五行数据,我们想删除第三行:pig删除文本指定行:删除文本指定行用的是foriini,找到指定行的关键字,将不包括关键字的其他行放在生成器中,将生成器包含的内容重新写入文件。我们这里不用readlines是因为foriinf是使用一行读取一行,不会消耗太多的内存。如果使用readlines就会一次性将所有的内容全部读取出来放在内存当中,会占用较多的内存,且不方便我们对…

    2022年5月30日
    167
  • NSGA2理解

    NSGA2理解NSGA-II算法学习什么是支配:支配就是统治,在各方面都优于其余个体如个体i支配个体j,就说明个体i在所有目标函数的表现上都不差于个体j,并且至少在一个目标上优于个体j;什么是非支配:非支配就是个体在种群中是最优秀的,它们在该种群中不受其余个体支配。快速非支配排序,将种群中的个体进行分层,最优秀的个体处于第一层,然后除了第一层,再从其余个体中找出非支配个体,以此类推…

    2022年5月19日
    79
  • request对象详解

    request对象详解 2018年10月27日15:45:51于易动 申请对象:类型:HttpServletRequest的:请求对象:封装了请求头信息,请求体信息等   .1:特点:类型:HttpServletRequest 2:生命周期:   诞生:客户端浏览器每次发出请求,都会创建一个响应对象。   销毁:服务方法执行完毕就会销毁   .3:请求对象的作用: a:作为域对象…

    2022年6月6日
    61
  • 【学习笔记】二元Logistic回归预测

    【学习笔记】二元Logistic回归预测目录 1 基本含义和思想 2 论文 3 进行回归预测的思路是什么 3 求逻辑回归模型的数学过程 3 1 改写函数 3 2 函数变换 3 3 得到离散概率 3 4 最大似然法 3 5 牛顿法 4 逻辑回归在论文 3 中的应用参考文章参考文献 1 基本含义和思想 Logistic 回归和线性回归最大的区别在于 Y 的数据类型 线性回归分析的因变量 Y 属于定量数据 而 Logistic 回归分析的因变量 Y 属于分类数据 分类数据指的是 Y 的结果不是一个值 量 而是一个类别 比如一件衣服的是否有人想购买 这里的 Y 是 是否愿意购买 属于分类

    2026年3月16日
    2
  • JDK卸载删除

    JDK卸载删除Java卸载1.进入环境变量,点击Java_Home2.进入路径,删除JDK清理环境变量删除path下关于Java的环境变量查看是否清除cdm运行输入java-version

    2022年6月20日
    36
  • 下载jieba 库[通俗易懂]

    下载jieba 库[通俗易懂]步骤:1.打开命令行2.联网3.在C:\Users\User>后面加语句 pipinstalljieba形成 C:\Users\User>pipinstalljieba然后按回车,然后就开始安装在最后一行出现Successfullyinstalledjieba-0.39 证明安装成功  PS由于我们用pip来安装的jieba库嘛…

    2026年2月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号