美文网首页
3-2.固定存储器着色器理解

3-2.固定存储器着色器理解

作者: Pufus | 来源:发表于2020-09-26 20:13 被阅读0次

    OpenGL渲染架构

    OpenGL渲染架构.png

    图中的 (1)TextureData (2)Uniforms (3)Attributes 只是传递数据的通道。

    1. Attributes

    利用Attributes通道的数据只能传递到VertexShader,也就是顶点着色器,是通过GLSL代码的方式间接的传递。

    经常要发生改变的值通常使用Attributes通道来进行传递。

    例如:顶点坐标、颜色、位移、纹理坐标、光照法线等。

    数据类型上面,可以是int、bool、float,也可以是四维向量等等。

    总结:就是不断发生改变的数据通常走这条通道。

    1. Uniforms

    利用Uniforms通道的数据可以传递到VertexShader和FragmentShader,也就是顶点着色器和片元着色器。

    与Attributes相反,通过Uniforms通道进行传递的数据都是比较稳定的,比较有统一,有制式的,不会经常的发生改变。

    总结:就是不怎么需要发生改变的数据通常走这条通道。

    1. TextureData

    TextureData可以传输到VertexShader中,但是这种方式极为的不常用,而且这是通过间接传递完成的,必要性不大。

    TextureData通道主要还是纹理传递通道,传输的另一端是FragmentShader。

    图中的Outs(输出)和Primitive Assembly(图元装配/光栅化)是OpenGL开发者没有办法直接参与或者干预的过程,不再多做解释。

    那么在这个流程架构图中,其实OpenGL开发者可以干预到的就只是VertexShader和FragmentShader。

    图元连接方式

    图元连接方式.png 图元连接方式名词解析.png

    OpenGL 点/线 api介绍

    //1.最简单也是最常⽤用的 4.0f,表示点的⼤大⼩小
    glPointSize(4.0f);
    //2.设置点的⼤大⼩小范围和点与点之间的间隔
    GLfloat sizes[2] = {2.0f,4.0f};
    GLfloat step = 1.0f;
    //3.获取点⼤大⼩小范围和最⼩小步⻓长
    glGetFloatv(GL_POINT_SIZE_RANGE ,sizes);
    glGetFloatv(GL_POINT_GRAULARITY ,&step);
    //4.通过使用程序点⼤小模式来设置点⼤小 glEnable(GL_PROGRAM_POINT_SIZE);
    //5.这种模式下允许我们通过编程在顶点着⾊器或几何着⾊器中设置点⼤小。着⾊器内建变量: gl_PointSize(内建变量),并且可以在着⾊器源码直接写
    gl_PointSize = 5.0
    //6. 设置线段宽度
    glLineWidth(2.5f);

    OpenGL 三角形

    对于OpenGL光栅化最欢迎的就是三角形,3个顶点就能构成一个三角形,三角形类型来自于顶点,并不是所有的三角形都是正三角形。

    image

    OpenGL三角形环绕方式

    在绘制第一个三角形的时候,线条是按照从v0~v1,再到v2。最后再回到v0的一个闭合三角形。这个是沿着顶点顺时针方向。这中顺序与方向结合来指定顶点的方式成为环绕。

    image

    在默认情况下,OpenGL认为具有逆时针方向环绕的多边形为正面。这就意味着上图左边是正面,右边是反面。

    glFrontFace(GL_CW);

    GL_CW:告诉OpenGL 顺时针环绕的多边形为正面;

    GL_CCW:告诉OpenGL 逆时针环绕的多边形为正面;

    OpenGL三角形带

    对于很多表面或者形状而言,我们会需要绘制几个相连的三角形,这时我们可以使用GL_TRIANGLE_STRIP图元绘制一串相连的三角形,从而节省大量的时间。

    image

    优点:

    • 用前3个顶点指定第1个三角形之后,对于接下来的每一个三角形,只需要再指定1个顶点。需要绘制大量的三角形时,采用这种方式可以节省大量的程序代码和数据存储空间。
    • 提供运算性能和节省带宽,更少的顶点意味着从内存传输图形可的速度更快,并且顶点着色器需要处理的次数也更少了。

    OpenGL三角形扇

    对于很多表面或者形状而言,我们会需要绘制几个相连的三角形,这是我们可以使用GL_TRIANGLE_FAN图元绘制一组围绕一个中心点相连的三角形。

    image

    OpenGL ⼯具类 GLBatch

    GLBatch是在GLTools中包含的⼀一个简单容器器类.

    void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);

    参数1:图元
    参数2:顶点数
    参数3:⼀组或者2组纹理理坐标(可选)

    //复制顶点数据(⼀一个由3分量量x,y,z顶点组成的数组)
     void GLBatch::CopyVerterxData3f(GLfloat *vVerts);
    
    //复制表⾯面法线数据 
    void GLBatch::CopyNormalDataf(GLfloat *vNorms);
    
    //复制颜⾊色数据 
    void GLBatch::CopyColorData4f(GLfloat *vColors);
    
    //复制纹理理坐标数据
    void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);
    
    //结束数据复制 
    void GLBatch::End(void);
    
    //绘制图形 
    void GLBatch::Draw(void);
    

    存储着色器分类(了解即可)

    存储着色器初始化

    GLShaderManager shaderManager;
    shaderManager.InitializeStockShaders();

    单元着色器

    GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);

    参数1: 存储着色器种类-单元着⾊器
    参数2: 颜⾊
    使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有片段都会以一种颜色填充

    平面着色器

    GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);

    参数1: 存储着⾊器种类-平⾯着⾊器
    参数2: 允许变化的4x4矩阵
    参数3: 颜⾊
    使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化).

    上色着色器

    GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

    参数1: 存储着⾊器种类-上⾊着⾊器
    参数2: 允许变化的4x4矩阵
    使⽤用场景: 在绘制图形时, 可以应用变换(模型/投影变化)
    颜色将会平滑地插⼊到顶点之间称为平滑着色.

    默认光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

    参数1: 存储着⾊器种类-默认光源着⾊器
    参数2: 模型4x4矩阵
    参数3: 投影4x4矩阵
    参数4: 颜⾊值
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.

    点光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);

    参数1: 存储着⾊器种类-点光源着⾊器
    参数2: 模型4x4矩阵
    参数3: 投影4x4矩阵
    参数4: 点光源的位置
    参数5: 颜⾊值
    使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化) 这种着⾊器会使绘制的图形产生阴影和光照的效果.它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的.

    纹理替换矩阵着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

    参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
    参数2: 模型4x4矩阵
    参数3: 纹理单元
    使用场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵.使⽤纹理单元来进行颜色填充.其中每个像素点的颜色是从纹理中获取.

    纹理调整着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

    参数1: 存储着⾊器种类-纹理调整着⾊器
    参数2: 模型4x4矩阵
    参数3: 颜色值
    参数4: 纹理单元
    使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将一个基本色乘以一个取⾃自纹理单元nTextureUnit 的纹理.将颜⾊与纹理进行颜色混合后才填充到片段中.

    纹理光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

    参数1: 存储着⾊器种类-纹理光源着⾊器
    参数2: 模型4x4矩阵
    参数3: 投影4x4矩阵
    参数4: 点光源位置
    参数5: 颜⾊值(⼏何图形的基本色)
    参数6: 纹理单元
    使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将一个纹理通过漫反射照明计算进行调整(相乘).

    相关文章

      网友评论

          本文标题:3-2.固定存储器着色器理解

          本文链接:https://www.haomeiwen.com/subject/giozyktx.html