zoukankan      html  css  js  c++  java
  • OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)

       

      上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了

    OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层

    的数据传递到shader中,在shader中完成相应的计算。

      先说下在这一节中,我们要完成的任务,不调用OpenGL的旋转函数(即glRotate××)

    系列函数,不使用矩阵完成对模型的旋转。要完成这样的功能,那么我们就只能借住shader

    来进行计算,编写shader更多的情况要求我们对数学知识了解到更多,掌握的更多,写shader

    就是写一些列的算法,这些算法多数数与数学相关的。今天我们要掌握的知识是:uniform类型

    变量的使用。

      看代码:

        uniform float times;
        void main( void )
        {
            float c = cos(times);
            float s = sin(times);
            vec4  temp = gl_Vertex;
            temp.x = gl_Vertex.x * c - gl_Vertex.y * s;
            temp.y = gl_Vertex.x * s + gl_Vertex.y * c;
            gl_Position = gl_ModelViewProjectionMatrix * temp;
            gl_FrontColor = gl_Color; 
        }

    从c/c++语言的角度来看shader,那么times变量就是一个全局变量,在程序中,我们通过使用

    这个全局变量,来完成对顶点的旋转工作,沿着z轴。现在纹理来了,我们在显卡中生命的变量

    如何才可以在c++的访问。OpenGL扩展api中提供了这样手段来访问uniform类型变量的手段。

    看代码:

    _times  =   glGetUniformLocationARB( _programObj, "times" );

    上面的函数是cpu上执行的函数,_times是一个无符号类型的变量,_programObj也是,在

    上一节中已经做过介绍,就是保存程序的句柄或者叫索引。glGetUniformLocationARB函数的

    第二个参数就是变量的名称,通过这个名称,我们可以得到这个变量对应的句柄(或者叫索引)

    后面通过这个索引我们可以访问shader中的times这个变量了。值得注意到是,这个变量的生存

    周期是对全局的。

      通过调用下面的代码,修改shader中times的值:

    static  float xxx = 0;
    
    glUseProgramObjectARB( _programObj );
    glUniform1fARB(_times,xxx);
    
    xxx +=  0.01f;
     if (xxx > 3.14f)
    {
         xxx =   0;
    }

    这样就将times的值修改了。大家可以慢慢体会这个过程,可以想象一下程序执行的过程,下一例程

    将给大家展示如何在vertex shader中声明例外一个类型的变量。

    代码下载

  • 相关阅读:
    【C# 调用 Go 语言】
    Go语言多线程 (转)
    CodeSoft 2019 企业版打标签
    (转)FFT求频谱图和功率谱密度图
    使用NI-DAQmx进行振动数据采集
    CentOS7 安装配置笔记
    .net 调用 nsfwjs 进行视频鉴别
    Electron.Net + Linux + Blazor 初尝备忘录
    关于feign调用的时候,动态传url ,以及自定义head
    go使用excelize导出xls
  • 原文地址:https://www.cnblogs.com/zhanglitong/p/3212611.html
Copyright © 2011-2022 走看看