zoukankan      html  css  js  c++  java
  • OpenGL12-shader(GLSL)着色语言1(代码已上传)

       

        OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言,

    也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)

    上执行的,代替了固定的渲染管线的一部分。比如:视图转换、投影转换等。GLSL(GL Shading Language)

    的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器)

    ,有时还会有Geometry Shader(几何着色器)。负责运行顶点着色的是顶点着色器。

    它可以得到当前OpenGL 中的状态,GLSL内置变量进行传递。

        先看下vertex shader,起设计目的是对应用层输入的顶点数据做处理,我们可以以一个简单的

    代码来看下定点处理的过程,可以把下面的过程看成是显卡处理定点数据的过程:

        

    void process( const Vertex& position,Vertex&  gl_Position)
    {         
        gl_Position = gl_ModelViewProjectionMatrix * position;
    }
    
    for (int i = 0 ;i < vertexCnt ; ++ i )
    {
        Vertex gl_Position;
        process( position[i],Vertex&  gl_Position);
        //! 对定点数据做其他的处理
    }
     

    上面的代码中process函数,就是我们要写的shader函数,里面对顶点数据进行处理,处理完成

    后交给下一个渲染流程。下面的for循环函数,是又显卡内部控制,当然也是在显卡内完成,即当

    我们在应用层调用OpenGL的函数 glVertex**或者glNormal等函数的时候,就是把顶点数据从

    cpu传递给GPU,就会调用Process函数进行处理(实际远比我说的复杂)。假设应用层有10万

    个顶点做计算,那么Process函数就会被调用10万次。试想这该是多么大的计算量,当然这个相比

    纹理来说还是小意思,当我们绘制一个图片处理的时候,每一个像素的绘制都要调用一个类似的处理

    过程函数进行处理,假设有一个1024 × 1024 的图片绘制出来,需要的计算量大家可想而知,说

    这个的道理在于我们要认识到显卡的强大计算能力。

    废话不说,看下面的一个代码片段,我们进行分析:

    void main( void )
    { 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    }

    上述的代码是一个最简单的顶点shader:

    gl_Position:是GLSL的一个内置变量,即输出的丁点位置

    gl_Vertex:是GLSL的一个内置变量,输入的顶点位置。

    gl_ModelViewProjectionMatrix:GLSL的内置变量:

    保存了 Project Matrix * View Matrix * Model Matrix的结果

    Model Matrix:保存了当前对顶点数据的缩放,旋转,平移等操作

    View Matrix :观察矩阵 ,

    Project Matrix:就是正交投影,或者透视投影的矩阵(调用 :glOrtho,或者 gluPerspective)

    通过上面的介绍,想必大家已经多shader的工作原理已经有所了解了,下面介绍shader的使用步骤:

    1.首先编写一个shader,当然是文本方式(其实也可以是汇编方式,或者bin方式,后面介绍)

    2.调用glCreateShaderObjectARB创建一个shader对象

    3.将源文件(就是shader 的程序)给shader对象

    4.进行编译

    单独的一个shader对象还不能使用,要想使用它,还需要创建一个shader program 对象,然后进行关联

    可以这样来理解,shader object 类似我们编译c++生成的obj文件,将obj文件连接生成一个exe.这个exe

    就是shader program了。

    5.建立一个shader program 

    6.关联shader object 到 shader program 

    7.进行链接

    8.使用这个程序。

            const char *source[1];
            source[0]   =   vertexShaderSource;
            //1 创建一个定点shader,理解成对源码进行编译
            g_vertexShader  =   glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB );
            //2 指定数据(就是代码)
            glShaderSourceARB( g_vertexShader, 1, source, NULL );
            //3 编译
            glCompileShaderARB( g_vertexShader);
            //4 看编译成功了没有
            glGetObjectParameterivARB( g_vertexShader, GL_OBJECT_COMPILE_STATUS_ARB, &bVertCompiled );
            //5 编译失败,打印错误的原因
            if( bVertCompiled  == false )
            {
                glGetInfoLogARB(g_vertexShader, sizeof(temp), NULL, temp);
                MessageBoxA( NULL, temp, "Vertex Shader Compile Error", MB_OK|MB_ICONEXCLAMATION );
            }
            //6 创建一个程序对象,可以理解成exe
            _programObj = glCreateProgramObjectARB();
            //7 将顶点shader与程序绑定
            glAttachObjectARB( _programObj, g_vertexShader );
            //8 链接过程
            glLinkProgramARB( _programObj );
            glGetObjectParameterivARB( _programObj, GL_OBJECT_LINK_STATUS_ARB, &bLinked );

    代码下载

  • 相关阅读:
    滑动窗口(单调队列)
    离散化
    leetcode第196场周赛
    WindowsForm实现警告消息框
    WindowsForm实现TextBox占位符Placeholder提示
    WindowsForm如何移动一个没有标题栏的窗口
    WindowsForm给窗口添加一些简单的动画效果
    WindowsForm切换窗口的几种常见实现
    Visual Studio Code搭建django项目
    PyInstaller打包Python源程序
  • 原文地址:https://www.cnblogs.com/zhanglitong/p/3209282.html
Copyright © 2011-2022 走看看