zoukankan      html  css  js  c++  java
  • OpenGL基础知识

    基本概念

    透视(Perspective)
    变换(Transformation)
    投影矩阵(Projection Matrix):用于将3D坐标转换为2D屏幕坐标
    光栅化(Rasterization): 实际绘制或填充每个顶点之间的像素形成线段
    着色器(Shader) 是在图形硬件上执行的单独程序,用来处理顶点和执行光栅化任务
    纹理贴图(Texture Mapping)
    混合(Blending): 将不同的颜色混在一起
    可编程着色器(Programmable Shader)
    位平面(bitplane):指一块内存区域,保存了屏幕上每个像素的位信息
    平截头体(Frustum):透视投影的视景体,四棱台的形状
    片段(Fragment):不是最后的像素数据, 但和像素对应, fragment需要经过处理(blend,texture,lighting...)才会得到最后的像素。

    视口(Viewport): 把绘图坐标映射到窗口坐标的区域
    图元(Primitives): 一维或二维的实体或表面(点,直线,多边形)
    顶点(Vertex): OpenGL顶点是4个分量(x, y, z, w)w为0时代表空间中的点,w为1时代表方向
    视景体(View Volume):定义了一个场景如何映射到屏幕上(透视投影还是正投影)其次,视景体定义了哪此部分被剪裁到最终的图像之外。

    计算机图形:变换着色纹理混合 

    矩阵模式:

    不同的操作需要切换到不同的矩阵下进行,操作必须和矩阵对应,否则操作无效

    下面函数就是用来指定哪一个矩阵是当前矩阵,有三种选择(投影矩阵模型视图矩阵纹理矩阵)

    void glMatrixMode(GLenum mode);

    GL_PROJECTION 要对投影相关进行操作,也就是把物体投影到一个平面上
    GL_MODELVIEW 要对模型视景的操作,
    GL_TEXTURE      要对纹理相关进行操作

    模型视图矩阵是模型矩阵和视图矩阵相乘得到的单一矩阵

    注意:设置完glMatrixMode之后必须调用glLoadIdentity,

    投影:

    OpenGL支持两种投影,透视投影和正投影

    正投影(Orthographic Projection)又名平行投影,此时可以指定的视景体是长方体
    透视投影(Perspective Projection)会进行透视除法距离观察者远的对象会变小,此时指定的视景体是平截头体

    下图左侧是正投影的视景体,右图是透视投影的视景体 即平截头体(Frustum)

    首先必须把当前矩阵设为投影矩阵, 才能修改投影方式

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

     正投影

    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

    glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。
    如果绘制的图空间本身就是二维的,可以使gluOrtho2D.

    透视投影

    void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);

    glFrustum函数定义一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。该函数构造了一个视景体用来将模型进行投影,来裁剪模型,决定模型哪些在视景体里面,哪些在视景体的外面,在视景体之外的就不可见。

    void glPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far)

    glPerspective也是用于透视投影,功能和glFrustum非常相似,参数不一样,用的较少。

    GLSL

    GLSL(OpenGL Shading Language)即OpenGL着色语言
    这是一种非常类似于C的程序设计语言。但是,GLSL不会对应用程序流程和逻辑进行控制,而是用于渲染操作。 

    OpenGL扩展机制:

    opengl支持不同硬件厂商扩展API或者枚举
    可以动态查询使用的OpenGL支持的扩展,使用GLEW库更简单
    代码:

    GLint ext_count;
    glGetIntegerv(GL_NUM_EXTENSIONS, &ext_count);
    // 获得扩展api的字符串名称
    glGetStringi(GL_EXTENSIONS, i)

    数据类型:

    错误处理:

    GLeunm glGetError(void);

    每次只返回一个值,返回后,保存的错误代码被清除
    通常:我们要在循环中调用glGetError()函数,直到返回GL_NO_ERROE为止

    获得硬件信息:

    可以使用下面函数获得硬件厂商的信息 

    glGetString(GLenum name)

    图形质量还是速度:

    void glHint(Glenum target, GLenum mode)

    target: 指定要进行修改的行为类型(抗锯齿,纹理压缩质量…),
    mode: 指定质量还是速度优先
    注意:这是唯一一个行为完全依赖厂商的函数,OpenGL并没有要求函数调用保持一致 

    OpenGL状态机:

    变量的集合成为管线的状态。状态机是一个抽象的模型,表示一组状态变量的集合 

    设置状态变量

    void glEnable(GLenum cap)
    void glDisable(GLenum cap)
    ...

    获取状态变量

    GLboolean glIsEnabled(GLenum cap);
    void glGetBooleanv(GLenum pname, GLboolean *params);
    void glGetDoublev (GLenum pname, GLdouble  *params);
    void glGetFloatv  (GLenum pname, GLfloat   *params);
    void glGetIntegerv(GLenum pname, GLint     *params);

    缓冲区:

    颜色缓冲区(Color Buffer)
    深度缓冲区(Depth Buffer)
    模板缓冲区(Stencil buffer)
    帧缓冲区(FrameBuffer): 指所有缓冲区一起串联工作,保存了图形硬件为控制屏幕上所有像素颜色和强度需要的全部信息

  • 相关阅读:
    2019-06-2 java学习日记
    2019-06-1 java学习日记
    2019-05-31 java学习日记
    2019-05-30 java学习日记
    2019-05-29 java学习日记
    2019-05-28 java学习日记
    2019-05-27 java学习日记
    2019-06-03 Java学习日记 day24 多线程
    2019-06-02 Java学习日记 day23 递归练习
    2019-06-01 Java学习日记 day22 io其他流
  • 原文地址:https://www.cnblogs.com/luweimy/p/4128279.html
Copyright © 2011-2022 走看看