zoukankan      html  css  js  c++  java
  • OpenGL学习

    1. 常识

     

    static GLint vertices[] = { 25, 25,

            100, 325,

            175, 25,

            175, 325,

            250, 25,

            325, 325 };//这些坐标,画的时候都是相对于屏幕右下角

     
    PS:如果修改了窗口的内容,就需要调用glutPostRedisplay();

     

     PS:窗口在创建的时候就发生了窗口大小的改变,所以要调用glutReshapeFunc, 可以看到每次窗口变化都调用了其中的代码

    2. OpenGL简介

    PS:接口包含函数700多个

    PS:OpenGL也没有提供包含三维物体的高级函数,只能通过使用为数不多基本图元(点、直线、多边形)来创建

    PS:OpenGL的工具库(GLU)提供了许多建模的功能,例如二次曲面以及Nurbs曲线和曲面

    1.1 OpenGL对场景中图形渲染的步骤

    1.创建几何图元,创建图形,建立数学描述

    2.在三维空间中排列物体,并选择观察符合场景的有利视角

    3.计算所有物体的颜色(可以由 程序决定、光照和物理纹理贴图     , 或者是三者的结合

    4.把物体的数学描述和物体的相关颜色信息转换成屏幕上的像素

    PS:OpenGL也是C/s的模式

    2.1              几个简单的概念

    PS:渲染,是计算机根据模型创建图形的过程

       模型,是根据几何图元创建的,也叫物体

       几何图元,包括点、直线和多边形,他们是通过顶点指定的

    像素-》位平面-》帧缓冲区

    PS:最终完成的的图像是由屏幕上绘制的像素组成。像素:是显示硬件可以在屏幕上显示的最小元素;在内存中,和像素有关的信息(例如像素的颜色)组织成位平面

    PS:位平面是一个内存区域,保存着屏幕上每个像素的1个位的信息,(比如它可以指定特定像素的颜色的红色成分信息)。位平面又可以组织成侦缓冲区的形式。

    PS:帧缓冲区,保存着所有像素的颜色和强度所需要的全部信息

    1.3 OpenGL是一个状态机

    PS:他可以用状态控制

    1.4显示列表

    PS:他是一种模式,  不管图元还是像素都可以放在显示列表中,供以后操作。

       也可以立即对数据处理,叫做立即模式。

    1.5 求值器 :提供了一个方法,根据控制点计算表面的顶点。

    2.2              一些API的简单介绍

    glClearColor(0.0, 0.0, 0.0, 0.0);//把屏幕清楚成什么颜色,R,G,B,模糊, 设置成1就是

    0.0是全黑色,

    1.0是向白色过度

    2.3     

    3. 状态管理和绘制几何物体

    3.1              绘图工具箱

    PS:OpenGL允许程序员任意设置坐标系统、观察位置和方向。   所以弄成清楚缓冲区,不能指定清除某些地方。

    PS: glClearColor(0.0, 1.0, 0.0, 0.0);//把背景改成绿色,清清除  颜色缓冲区

       glClaer(GL_COLOR_BUFFER_BIT);清除颜色缓冲区,还有 深度缓冲区、累积缓冲区、模板缓冲区

    颜色选择

    1.一般会先考虑颜色方案,再考虑绘制物体的颜色

    glFlush()强制命令去执行;

    2.1.4 坐标系统工具箱

    glViewport();用于调整绘图的函数矩形

    PS:当窗口移动或者发生窗口大小改变的时候。

    3.2     

    3.3     

    3.4              显示点、直线和多边形

                                        PS:在GLBegin()和GLend()之间,只能放点的信息,不能放其他信息

    点和直线的细节

    PS:默认的情况下,点是一个像素

    PS: glPointSize(size)设置点的大小

       glLineWidth(size)设置直线的宽度

    PS:………………………..默认是1.0,如果启用锯齿的功能,可以为浮点数

    PS:glLineStipple(1,0xddd);点划线

    多边形的细节

    PS:正常情况下,多边形正反面 会被渲染成相同;

    glPolygonMode(x,x);指定绘制模式

    PS:可以根据glFrontFace()指定正反面;

    点画多边形

    PS:glPloygonStipple()

     

    多边形的边界

    有时候为了绘制非凸的多边形,得使用glPloygonMode(),但是同时需要告诉谁是终点glEdgeFlag(true);

    3.5              法线向量

    物体的法线向量定义了他在空间中的方向;定义了他相对于光源的方向

    PS:

      如果模型只涉及旋转和移动、发现能够保持规范化;但是如果进行了不规则变化(缩放,剪切),那就需要手动进行规范化glNomalize()

    2.6顶点数据--为了解决大量的调用函数

    PS:使用顶点数组 渲染 图形的过程

    1. 激活数组(最多8个)

    gLEnableClientState(GL_Vertex_Array);后面的枚举值不确定,还有很多的其他的种类。

    ------------------------------------------

    1. 把数据放入数组
    2. glVertexPointer(size,type,stride,*poninter);
    3. 用这些数据绘制几何图形,三种方式能完成该功能
    4. ------------------------------------------------------------------

    3.1访问单个数组元素

    glArrayElement(3);

    3.2 创建一个单独数组元素列表

         glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_INT, indices);

    3.3线性的处理数组元素

    glDrawArrays(GL_TRIANGLES, 0, 6);

    混合顶点数组可以吧不同类型的数据(颜色、法线、坐标)放在数组中

    2.7 缓冲区对象 –这是类似于OpenGL的一个东西

    2.8 创建多边形模型的一些提示

    PS:如果启用了光照,就必须指定法线的向量

    3 视图

    PS: 视图变换:确定  场景的位置;

    模型变换:场景中模型的位置

    投影变换:确定视景体的形状。

    视口:决定最终的位置

    PS:计算机图形的要点就是 创建三维物体的二维图像

    一个物体的三维坐标变成屏幕上的像素经过:

    1.变换(矩阵相乘)  移动、旋转、缩放、平移、反射、投影等等。

    2.剪裁掉屏幕外面的物体

    3.经过了变换坐标和屏幕像素建立对应联系,这个过程叫做视口(viewport)

    PS:视口变换:把三维坐标转换为屏幕坐标

    PS:顶点的变换步骤:

    物体坐标-》模型矩阵------视觉坐标-----》投影矩阵-----剪裁坐标------》透视出发----规范化坐标系----》视口变换---窗口坐标---》

    PS:投影变换分为2种:1.透视投影(类似于生活中,火车轨道在远处)glFrustum 2.正投影(直接投影);glOrtho使用的是正投影

    变换和模型变换是相对而言的,两者可相互转换;从一个方向移动照相机和从相反方向移动物体是一样的。

    PS:注意事项:

    1. 在调用变换函数时,需要确定自己要修改的是 模型视图矩阵还是 投影矩阵;通常在变换之前需要glLoadIndentity();修改矩阵为4*4的单位矩阵
    2. 可以使用    显示列表来存储经常使用的矩阵
    3. 执行模型和视图变换之前必须GL_MODELVIEW进行转换(在执行的时候顺序是很重要的)

    3.1    执行NMLv变换,变换是逆序执行的,先v*L,L*M…….

    3.2    两种坐标系统,全局和局部

    PS:一个按照逆时针方向旋转的物体模型变换==按顺时针方向旋转的照相机的视图变换

    模型变换:主要有移动Translate,旋转rotate,伸缩scale

    PS:通常先模型变换再视图变换;视图变换也是有 移动和选择构成的;

    Gllookat封装就是  Translate和Rotate

    默认相机在原点,与Z轴相反,y为正方向的朝上方向

    PS:经过模型矩阵和视图矩阵 变换之后,会自动剪裁到相应的面,其他相应面也能剪裁(需要自己指定)

    GLPushMatrix 、GLPopMatrix

    比方:
    glLoadIdentity();
    glTranslatef(1,0,0);//向右移动(1,0,0)
    glPushMatrix();//保存当前位置
    glTranslatef(0,1,0);//如今是(1,1,0)了
    glPopMatrix();//这样,如今又回到(1,0,0)了

    PS:太阳系的那个例子,他执行了相应的变换,重新绘图已经弹出,正好重新绘制

    4 颜色

    4.1   计算机颜色

    PS: 硬件装置使屏幕上的每个像素发射不同的红、绿、蓝;每一个像素的颜色信息可以按照RGBA模式或颜色索引模式存取;

    在颜色索引模式下,每个像素存储一个表示颜色序号的数值;用于存储所有像素颜色的内存成为颜色缓冲区;

    PS:在没用光照的情况下,颜色是不可能变的; 用了光照,颜色也有可能变了;

      单调着色,和平滑着色 会对像素产生不同的影响;

    4.2      颜色的选择

    PS:默认情况下,建议使用RGBA,颜色索引是用在一些特殊的技巧

    PS:多窗口,可以为每一个窗口赋予不同的颜色和值

    RGB模式

    glColor()

    颜色索引模式

    glIndex();  

    glClearIndex(); 清除当前颜色

    4.3      指定着色模式

    glShadeModel()  //Falt还是SMOOTH

     

    5 光照---1.隐藏表面消除2.如何控制场景中的光照

    PS:OpenGL把光照模型分为: 环境光、散射光、镜面光、发射光

    PS:  OpenGL 的光照成分是LR,LG,LB;材料是MR,RG,MB 进入人眼的光就是   两个向量单个相乘

         两个入射光叠加在一起,光就是进入眼睛就是向量相加

    PS:为了正确计算灯光必须保证  表面发现的规范化 (单位矩阵),使用GL_RESCALE_NORMAL函数

    PS:一个光有很多参数

    GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR 是与颜色相关的,要想做到逼真,必须把后两者定义成一模一样

    灯光的位置和衰减

    PS:光分为平行光和位置光源,位置光源会随着位置变动而衰减

    控制光源的位置和方向:通过修改模型矩阵或者来修改

    1. 光源保持静止
    2. 光动物体不动
    3. 物体动光也动

    选择光照模型

    4种

    全局光、局部远处、双面、镜面辅助·

    定义材料的属性

    第6章 本章主要讲6种技巧---主要使效果更好

    PS:混合、抗锯齿、雾、点参数、多边形偏移

    第七章 显示列表

    PS:显示列表就是一组存储在一起的OpenGL函数,方便以后执行;之前学习的都是立即模式

    glNewList(listName, GL_COMPILE);

        glColor3f(1.0, 0.0, 0.0);  /*  current color red  */

        glBegin(GL_TRIANGLES);

        glVertex2f(0.0, 0.0);

        glVertex2f(1.0, 0.0);

        glVertex2f(0.0, 1.0);

        glEnd();

    glEndList();

    第8张 位图 和 图像

    第九章  纹理贴图

    第10章 侦缓冲区

    PS:存储所有像素的存储空间称为侦缓冲区,  每个像素存了1位信息的缓冲区又称为位平面

    PS:各种缓冲区的操作                                                                                                                                 

    11 分格化 和 二次方程表面

    PS:分格化就是对凹多边形分割成凸多边形,就是一组函数

    PS:二次方程表面慢慢被废弃掉了

     

    PS: OpenGL只支持一些函数简单的,复杂的无法创建;GLU提供的了一些方法

    12 重点学习 求值器和NURBS

    PS:书中说了会返回物体的顶点数据;

    PS:非常实用的曲线和曲面都是通过控制点(几个参数)来模拟

    PS:求值器提供了一种方式,只用少数的控制顶点来指定曲线或表面(包括各种曲面)

    1.  一维求值器

     

    12.3 GLU 的NURBS例子

    13  选择 和 反馈

    PS:选择是OpenGL的一种操作模式;反馈是另一种模式

  • 相关阅读:
    Android Studio的project中两个build.gradle配置的区别
    build script和all projects作用和区别
    让overflow:auto页面滚动条出现时不跳动
    GreenDao设置数据版本
    Greendao 缓存问题
    js中文编码到C#后台解码
    content-type: application/json没有设置导致的500错误
    Android的Device File Explorer刷新文件
    adb server version (31) doesn't match this client (40); killing...
    Sqlserver远程过程调用失败
  • 原文地址:https://www.cnblogs.com/bee-home/p/7691788.html
Copyright © 2011-2022 走看看