计算机图形学

OpenGL ES学习笔记(三)——纹理

此生再无相见时 提交于 2020-02-28 12:40:25
首先申明下,本文为笔者学习《OpenGL ES应用开发实践指南(Android卷)》的笔记,涉及的代码均出自原书,如有需要,请到原书指定 源码地址 下载。 《 OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成 》中阐述的平滑着色、自适应宽高是为了实现在移动端模拟真实场景采用的方法,并且通过w分量增加了三维视角,在具体实现上采用了正交投影、透视投影的理论。本文将在此基础上,构建更加精美的三维场景。三维效果本质上是点、直线和三角形的组合,纹理是将图像或者照片覆盖到物体表面,形成精美的细节。在实现上具体分为两步:1)将纹理图片加载进OpenGL;2)OpenGL将其显示到物体表面。(有点像把大象装进冰箱分几步~~~)不过,在实现过程中,涉及到着色器程序的管理,涉及到不同的纹理过滤模式,涉及到顶点数据新的类结构等问题,下面将一一对其阐述: 纹理加载 纹理着色器 更新顶点数据类结构 着色器程序类 纹理绘制 一、纹理加载 将纹理覆盖到物体表面,最终是通对齐坐标来实现的。而OpenGL中二维纹理的坐标与计算机图像的坐标并不一致,因此,首先对比下两者的不同。 可见,两者的差别在于绕横轴翻转180度。另外,OpenGL ES支持的纹理不必是正方形,但每个维度都必须是2的幂。 加载纹理图片的方法参数列表应该包括Android上下文(Context)和资源ID

计算机图形学————viewing transform视图变换

江枫思渺然 提交于 2020-02-26 12:50:14
学习目标 1、能够建立 相机坐标系 2、理解不同投影方式的特点 3、能建立所需的投影矩阵并用openGL实现 4、描述clipping的操作和函数 图像的产生过程 1、摆放好待拍摄的物品,或者人物。 这个时候物品或者人物就是在世界坐标系里,就是在一个公认的坐标系中,目的是保证待拍摄的物体和照相机在同一个坐标系 2、调整好拍摄角度。 WC->VC 这一步相当于视图变换,这时候的坐标就是camera coordinate system(VC) 这个过程是调整Camera到合适的位置以便拍摄,这里要计算View Matrix 3、调焦。 投影变换 4、拍摄。 要指定viewer坐标系,我们需要指定三个向量 VRP: view reference point 坐标系的原点(即摄像机的物理位置) VPN: View plane normal 给出相机指向的向量 vc的z轴 VUP: View UP Vector 定义胶片向上方向的矢量(图像) PRP:投影参考点 这三个向量都是在WC里的,不一定要是单位向量 从wc到vc的坐标表示 P(VC) = M(VC←WC)* P(WC) Note: XVC, YVC, ZVC 是WC中的单位列向量 在opengl中实现 glMatrixMode (GL_MODELVIEW); gluLookAt (x0, y0, z0, xref, yref,

计算机图形学:基本变换

放肆的年华 提交于 2020-02-23 17:39:03
基本变换 1 基向量的变换 1.1 基向量的变换 初始基向量为 i ^ ( 1 , 0 ) , j ^ ( 0 , 1 ) \hat{i}(1,0),\hat{j}(0,1) i ^ ( 1 , 0 ) , j ^ ​ ( 0 , 1 ) ,经过变换后变为 i ^ ( 3 , − 2 ) , j ^ ( 2 , 1 ) \hat{i}(3,-2), \hat{j}(2,1) i ^ ( 3 , − 2 ) , j ^ ​ ( 2 , 1 ) 1.2 线性变换对向量的作用 仅需取出向量的坐标,将它们分别于矩阵的特定列相乘,然后将结果相加即可 逆时针旋转90°的例子 当两个向量变为线性相关时,两个向量共线,二维空间会被挤压到一维 2 Transformation Classification(分类) 2.1 Rigid-body Transformation (刚体变换) 物体本身的长度、角度、大小不会变化包括: Identity(不变) Translation(平移) Rotation(旋转) 以及他们的组合 2.2 Similarity Transformation(相似变换) 保持角度 Identity(不变) Translation(平移) Rotation(旋转) Isotropic Scaling(均衡缩放) 以及他们的组合 2.3 Linear

OpenGL视点变换,模型变换,投影变换,视口变换详解

荒凉一梦 提交于 2020-02-23 03:40:31
OpenGL视点变换,模型变换,投影变换,视口变换详解 http://blog.csdn.net/yhb5566/article/details/7714319 作者:luck_net | 出处:博客园 | 2012/2/22 14:46:49 | 阅读112次 OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。理解掌握了有关坐标变换的opengl图片内容,就算真正走进了精彩地三维世界。 一、OpenGL中的三维物体的显示 (一)坐标系统 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。 为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。世界坐标系是始终固定不变的。 OpenGL还定义了局部坐标系的概念,所谓局部坐标系,也就是坐标系以物体的中心为坐标原点,物体的旋转或平移等操作都是围绕局部坐标系进行的,这时,当物体模型进行旋转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。需要注意的是,如果对物体模型进行缩放操作,则局部坐标系也要进行相应的缩放,如果缩放比例在案各坐标轴上不同

计算机图形学——直线扫描转换(基本光栅图形算法)

假装没事ソ 提交于 2020-02-20 04:43:53
一、直线生成基本思路 图形图像是由屏幕上不同亮度不同颜色的光点(像素)组成。在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。 所以:对直线进行光栅化的时候,只能在显示器所给定的有限个像素组成的点阵中确定最佳逼近于该直线的一组像素,用这些像素表示该直线。 所以:生成直线的主要工作是:快速找出距离直线最近的网格点,用这些网格点对应的像素表示该直线。 如果我们使用斜截式方程来表示直线,会用到一次乘法和一次 加法,在计算机底层乘法是费时的,那么有什么方法可以改进? 变乘法为加法! 直线是象素集合,生成算法的最终目的,就是为了寻找能更准确逼近直线的象素点。 所以,要确定直线上每个点,那么,如:m<1时,从起始点xs,xs+1, xs+2, xs+3 ……到xe的每个点(xi,yi) ,需要确定其对应的象素值。 所以,每一个(xi,yi)即准确值,都要寻找对应其的象素值(xi,yi,r),即,最接近其准确值的整数值,最简单-取整 。 假设(xi,yi)已经确定了它的对应整数象素点,则下面就要找个规则确定下一个点即(xi+1, yi+1)的对应象素点。 对应于上述情况,即m<1的情况, xi+1=xi+1,即yi+1需要确定,即需要确定上述说的准则,即给定一个判定式,由判定式来确定yi+1的选择。 而判定式为了计算方便也可以有更简便的方式来计算

当神经网络遇上计算机图形学,会碰撞出怎样的火花?

99封情书 提交于 2020-02-14 14:33:05
来源商业新知网,原标题:TensorFlow也可以做图形渲染了:当神经网络遇上计算机图形学 谷歌给TensorFlow加入了计算机图形处理功能 TensorFlow Graphics ,让神经网络可以更好地理解计算机世界里的图形操作。 计算机图形 (Computer Graphics)和 计算机视觉 (Computer Vision)是一对孪生兄弟,二者互为逆过程。 计算机图形是预先知道3D物体的形状、位置、材料构成,以及场景的灯光和相机,然后渲染出场景。 计算机视觉是已知拍到的图像,从中推断出有哪些物体,它们由什么材料制成,以及它们的3D位置和方向。 图像识别自然不必多说。在TensorFlow Graphics,图像渲染包括对图形进行旋转、缩放、光影、3D网格等操作。 旋转 旋转在与一些机器人任务中非常重要,比如,用机械臂抓住物体需要精确估计这些物体相对于臂的位置。 缩放 缩放计算机视觉中起着重要作用,因为它会极大地影响投影到平面上的三维物体的外观。 光影材质 材质模型定义光与对象的交互方式,展现这种材料独特的外观。在某些虚拟环境中,可以预测某些物体的真实外观。 几何形状 从手机深度传感器到自动驾驶汽车激光雷达,近年来3D传感器越来越多。它们以网格或者点云的方式输出3D数据。 由于它们的不规则结构,与提供规则网格结构的图像相比,这些表示上的卷积很难实现。TensorFlow

图形渲染管线简介

元气小坏坏 提交于 2020-02-14 13:58:34
The Graphics Rendering Pipeline 渲染管线,这章主要讲光栅化渲染管线。 毕业前实习时,也实现过一个简单的软光栅化渲染管线,再复习一下。 在计算机图形学领域,shading指基于表面相对灯光的角度、距灯光的距离、相对于相机的角度和材质的属性等来修改物体/表面/多边形的颜色,进而创造一个具有真实感效果的过程。 In computer graphics, shading refers to the process of altering the color of an object/surface/polygon in the 3D scene, based on things like (but not limited to) the surface's angle to lights, its distance from lights, its angle to the camera and material properties (e.g. bidirectional reflectance distribution function) to create a photorealistic effect. Shading is performed during the rendering process by a program called a

计算机图形学——光线追踪算法分析

拟墨画扇 提交于 2020-02-10 17:41:56
1.求交 光线追踪主要的计算量来源于大量的求交计算。设O代表射线起点,D方向 ,P为圆上的点,C为圆心,r半径。球的方程为:(P - C)(P - C) = r * r ,直线的参数方程: p(t) = O + tD。 将直线方程代入后得D 2t 2+2(O-C)Dt+(O-C) 2-r 2=0,随后利用一元二次方程求根公式,判断有无解,有两个解时,选择>0且较小的t。 求交的基本原理就是将射线的参数方程代入到圆的函数中,求t的值。 将P(t) = O + tD 代入圆方程,会得到 t 的一元二次方程。 先求出Vec op,op是用球心p的坐标减去射线的起点 (O - C)。 b = op.dot(r.d)指代 ” D * (O - C) ” 求det,这里要注意我们求的b和原理中的b差了两倍,所以可以直接用 double det = b * b - op.dot(op) + rad * rad; 如果det<0说明无解,直接return 0; 否则求根号的det; 最终的解有一个或两个,可能在 t = b - det,或者t = b + det中,选择t大于0并且两个中较小的t。 2.绘制 用6个很大的球体当做平面(DIFF属性,只有漫反射),因为半径很大的话,你在近距离看起来,球面就很像一个平面。 作者这样做应该是为了避免去写平面求交,平面类等函数。 用1个球表示光源

OpenGL 简明教程(三)着色器

拟墨画扇 提交于 2020-02-06 13:25:06
3.1 开始 着色器(Shader)是运行在GPU上的小程序,上一篇中我们学会了如何使用着色器来将顶点数组变成我们想要的图形——三角形,在本篇中我们要作出其它图形,比如矩形;着色器的配置方法,还有图形的颜色的配置,实现一些其他色彩等等。 3.2 矩形 3.2.1 添加顶点 如果只运用上一篇的知识,要绘制一个矩形,可以看作绘制两个相连的三角形。如此一来只要向着色器程序中传入两个三角形——6个顶点数据即可,着色器程序也不需要改动。 GLfloat vertices [ ] = { // 第一个三角形 0.5f , 0.5f , 0.0f , // 右上角 0.5f , - 0.5f , 0.0f , // 右下角 - 0.5f , 0.5f , 0.0f , // 左上角 // 第二个三角形 0.5f , - 0.5f , 0.0f , // 右下角 - 0.5f , - 0.5f , 0.0f , // 左下角 - 0.5f , 0.5f , 0.0f // 左上角 } ; 只要主循环中的绘制函数作些许改动,就能实现一个矩形的绘制。 // 将原来的 3改为 6,绘制 6个顶点的三角形 glDrawArrays ( GL_TRIANGLES , 0 , 6 ) ; 3.2.2 索引方式 绘制矩形要使用 6个顶点有些浪费机能,实际上矩形只有 4个顶点,OpenGL 提供了索引绘制方式

旁观OpenGL里的透视投影矩阵

一笑奈何 提交于 2020-02-06 11:58:04
OpenGL里的代码已经形成和使用了好多年,从程序员的角度,对OpenGL底层代码做升级或修改的实际意义并不大,而且风险高。所以,修改底层算法的想法是有些太狂了。但是,从教学的角度、提供一种新的视角去理解、或者重新再解读前人代码字里行间潜在的、独立于代码作者的理解而存在的深意,应该是值得探讨探讨的。这就是旁观了,观棋不语真君子,实在手痒拿起棋子、自己从头用代码把等价的功能重新实现一遍,或者是可能的。 我记得当年刚学Turbo Pascal /Turbo C 2.0编写几何变换程序的时候,我感觉 “平行投影”、尤其三维空间里向 x O y xOy x O y 坐标平面的正平行投影是毫无意义、根本不需要存在的,而且我自己也完全没有意识到它存在就已经开始画图了。因为获得三维的点坐标 ( x , y , z ) (x,y,z) ( x , y , z ) 之后,直接从代码里面拿 ( x , y ) (x,y) ( x , y ) 的数据来用就是了,谁还管它投影不投影?头晕不头晕、麻烦不麻烦? 从很多国内搞图形学的研究者们发表的文章里来看,即使认识到齐次坐标和齐次矩阵表示几何变换的重要性和有用性,大家也一直并不严格区分降秩的投影和非降秩的几何变换。所以,概念的理解上至少在不少实用派的人的认识中实际是一直处于混乱状态,但这不意味着所有的人都糊涂。但糊涂的人多了,带着这种糊涂认识的文章