openGLSL Shader 大概用法流程

1.首先,必须要有一个能够读取文件的函数用来读取Shader,将Shader中的语句读到一个字符指针中,并返回这个指针,比如如下这个函数:

 1 char* readFileFuc(char* filename){
 2     FILE* fp = fopen(filename, "r");
 3     if (fp == NULL){ return NULL; };
 4     fseek(fp, 0L, SEEK_END);
 5     long size = ftell(fp);
 6     char*buf = (char *)malloc(size * sizeof(char));
 7     memset(buf, 0, size);
 8     fseek(fp, 0L, SEEK_SET);
 9     fread(buf, sizeof(char), size, fp);
10     //buf[size] = ‘ ‘;
11     fclose(fp);
12     cout << buf;
13     return buf;
14 }

以上函数能将文件的原文读到buf中,但我在网上找过其他的方法,将结果cout出来末尾总会多几个屯屯屯,只有这个方法最好,故暂时用这个来读取文件。

##更新##

代码变成:

char* readFileFuc(char* filename){
    FILE* fp = fopen(filename, "r");
    if (fp == NULL){ return NULL; };
    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);
    char*buf = (char *)malloc((size+1) * sizeof(char));
    memset(buf, 0, size);
    fseek(fp, 0L, SEEK_SET);
    fread(buf, sizeof(char), size, fp);
    buf[size] = ‘\0‘;
    //buf[size] = ‘ ‘;
    fclose(fp);
    cout << buf;
    return buf;
}

多分配一个字节,并且让最后一个字节是‘\0‘!!!!,这很重要,否则读出的内容最后的部分会指向某个不知道的地方!

2,有了这个函数之后便可以创建相应的Shader程序了,通常Shader有两个,一个Vertex Shader,一个Fragment Shader,

GLuint p;//use to return the handle of the program
GLuint& set_shaders()
{
    GLuint v = glCreateShader(GL_VERTEX_SHADER);
    GLuint f = glCreateShader(GL_FRAGMENT_SHADER);

    char *vs = readFileFuc("vShader.glsl");
    char *fs = readFileFuc("fShader.glsl");
    const char *vv=vs;
    const char *ff=fs;

    glShaderSource(v, 1, &vv, NULL);
    glShaderSource(f, 1, &ff, NULL);

    int success;

    glCompileShader(v);
    glGetShaderiv(v, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        char info_log[5000];
        glGetShaderInfoLog(v, 5000, NULL, info_log);
        printf("Error in vertex shader compilation!\n");
        printf("Info Log: %s\n", info_log);
    }

    glCompileShader(f);
    glGetShaderiv(f, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        char info_log[5000];
        glGetShaderInfoLog(f, 5000, NULL, info_log);
        printf("Error in fragment shader compilation!\n");
        printf("Info Log: %s\n", info_log);
    }

    p = glCreateProgram();
    glAttachShader(p, v);
    glAttachShader(p, f);
    glLinkProgram(p);
    glUseProgram(p);

    free(vs);
    free(fs);

    return p;
}

GLuint p是我定义的一个全局变量,用来返回shader program的。发现其实就几步:

glCreateShader->readFileFuc->glShaderSource->glCompileShader-> glGetShaderiv->glCreateProgram()->glAttachShader->glLinkProgram->glUseProgram

3,在初始化函数init()中,(init()是随便定义的),获取set_shaders的program,便可以使用了,贴上初始化函数代码:

void init()
{

    point3 points[NumPoints];
    //为三角形指定顶点
    point3 vertices[4] = {
        point3(-1.0, -1.0, -1.0), point3(1.0, -1.0, -1.0), point3(0.0, 1.0, -1.0), point3(0.0, 0.0, 1.0)
    };
    //在三角形内部选择一个任意的初始点
    points[0] = point3(0.0, 0.0, 0.0);

    for (int i = 1; i < NumPoints; ++i){
        int j = rand() % 4;
        points[i] = (points[i - 1] + vertices[j]) / 2.0;
    }

    GLuint program = set_shaders();
    glUseProgram(program);//这句加不加无所谓
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    //创建并初始化一个缓冲区对象
    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points)/*+sizeof(colors)*/, points, GL_STATIC_DRAW);
    //初始化顶点着色器中的顶点位置属性
    GLuint loc = glGetAttribLocation(program, "vPosition");
    glEnableVertexAttribArray(loc);
    glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(75, 1.0, 2.0, -10);
    glMatrixMode(GL_MODELVIEW);
    glPointSize(2.0);
}

有关

 glGenVertexArrays(1, &vao);glBindVertexArray(vao);..这几个函数,等我弄明白了再贴
时间: 2024-10-08 10:17:12

openGLSL Shader 大概用法流程的相关文章

git 命令用法 流程操作

Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于网络连接或中心服务器.其最大特色就是"分支"及"合并"操作非常快速.简便. 第一步  先下载git  下面是下载地址 https://git-scm.com/downloads 第二步 我下载的是Windows 版本, 打开Git Bash Here,在命令行中输入 cd d:    

c#中返回Task&lt;T&gt;与T的大概用法

在某项目中,因需要对一个通用控件做代码重构,安排一些事件前检查点与事件后检查点,方便在具体业务中,对些通用控件做继承后,加入特定的业务控制逻辑. 在重构代码的的过程中,把主要处理逻辑分成三部分:PreCheck(),Check(),AfterCheck().又为了方便在各个方法体中使用异步方法获取数据,把三个方法的类型,都定义成Task<T>.这种时就碰到了小问题:如果方法体中,不需要使用异步方法时,如果定义return的值. 经过测试,有了如下发现:如果方法定义为 protected vir

Tcl与Design Compiler (三)——DC综合的流程

本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 1.基本流程概述 首先给三个图,一个图是高层次设计的流程图: 下面是我对这张图的理解: ① 设计之前,准备好库.HDL代码的思想.约束生成:然后根据设计思想用 RTL 源码详细地.完整地为设计建立模型.定义设计中寄存器结构和数目.定义设计中的组合电路功能.定义设计中寄存器时钟等等的设计规格和实现. ② 完成 RTL 源码

Cesium原理篇:6 Render模块(3: Shader)

在介绍Renderer的第一篇,我就提到WebGL1.0对应的是OpenGL ES2.0,也就是可编程渲染管线.之所以单独强调这一点,算是为本篇埋下一个伏笔.通过前两篇,我们介绍了VBO和Texture两个比较核心的WebGL概念.假设生产一辆汽车,VBO就相当于这个车的骨架,纹理相当这个车漆,但有了骨架和车漆还不够,还需要一台机器人来加工,最终才能成产出这辆汽车.而Shader模块就是负责这个生产的过程,加工参数(VBO,Texture),执行渲染任务. 这里假设大家对Shader有一个基本的

从零开始入门 K8s | 调度器的调度流程和算法介绍

导读:Kubernetes 作为当下最流行的容器自动化运维平台,以声明式实现了灵活的容器编排,本文以 v1.16 版本为基础详细介绍了 K8s 的基本调度框架.流程,以及主要的过滤器.Score 算法实现等,并介绍了两种方式用于实现自定义调度能力. 调度流程 调度流程概览 Kubernetes 作为当下最主流的容器自动化运维平台,作为 K8s 的容器编排的核心组件 kube-scheduler 将是我今天介绍的主角,如下介绍的版本都是以 release-1.16 为基础,下图是 kube-sch

Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程

1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能测试,在Mali GPU驱动中激活性能测试对性能影响微不足道. 1.1 DS-5 Streamline简介 可使用DS-5 Streamline从CPU和Mali GPU中实时收集性能计数器,然后以图形方式显示这些计数器,其主要功能如下:     ? 收集计数器--从CPU和Mali GPU中     ? 保存收集到的计数器数据以供回放     ? 查看显示GPU活动.GPU活动和Framebu

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准.OpenGL ES是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.Cocos2d-x底层图形渲染使

cocos2dx(3.X)中使用shader

原文链接:http://blog.csdn.net/xufeng0991/article/details/47256583 一 shader的基本概念 1 什么是shader shader即着色器,就是专门用来渲染3D图形的一种技术. 通过shader,可以自己编写显卡渲染画面的算法,使画面更漂亮.更逼真. 2 shader分类 shader又分两种,一种是顶点shader(3D图形是由三角形组成的,顶点shader就是计算顶点位置,并为后期像素渲染做准备的), 另一种是像素shader,就是以

随口讲讲入门时的测试流程

刚入门测试行业,想来讲一下测试的大概的流程,当作是记录吧 我们的项目是每个月发一个版本,也就是说每月的最后一天发版,一个月就是一个轮回.从1号开始讲,1号的早上呢,老大会叫我们看SVN上的需求,我们要大概的了解一下这个月需要做什么需求,对于不懂的需求要及时提出来.那么去哪提出来,向谁提呢?那就是1号下午开会了,这是一个月的第一个会议,叫做需求评审,参与的人员有产品经理,测试人员,开发人员.主要针对这个月要发版的需求进行解说,我们测试人员遇到的问题也就在产品经理解说的过程中解决了疑惑,一些还是解决