OpenGL ES GLSL 着色器使用过程

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 转场

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES 函数

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GPUImage 使用

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GLSL 编程


一.着色器使用流程简介

流程如下:

  • 1,创建着色器对象
  • 2,把源码关联到每个着色器对象
  • 3,编译着色器
  • 4,创建程序
  • 5,关联着色器到程序对象
  • 6,链接程序
  • 7,激活和关闭着色器程序
  • 8,删除着色器和程序
OpenGL ES GLSL 着色器使用过程

二.创建着色器对象

1.片元着色器

  • ⼀般⽤来处理图形中每个像素点颜色计算和填充;
  • ⽚段着⾊器OpenGL 中⽤于计算⽚段(像素)颜色的程序。⽚段着色器是 逐像素运算的程序,也就是说每个像素都会执行⼀次⽚段着⾊器,当然也 是并行的。

2.顶点着色器

  • ⼀般用来处理图形每个顶点变换(旋转/平移/投影等)
  • 顶点着⾊器是 OpenGL 中⽤于计算顶点属性的程序。顶点着⾊器是逐顶点运 算的程序,也就是说每个顶点数据都会执行一次顶点着⾊器,当然这是并 ⾏的,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据
  • 一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照 运算等等。顶点坐标由自身坐标系转换到归一化坐标系的运算,就是在这 ⾥发生的。

顶点着色器决定一个图元应该位于屏幕的什么位置,而片元着色器决定某个片元的颜色应该是什么

GLint vertSahder,fragShader;//顶点着色器,片元着色器

vertSahder = glCreateShader(GL_VERTEX_SHADER);
fragShader = glCreateShader(GL_FRAGMENT_SHADER);

三.关联到每个着色器对象

//着色器源码位置
OGLTextFile vertSources("D://","vert.shader");
OGLTextFile fragSources("D://","frag.shader");

//获取源码内容
OGLString vertText = vertSources.getText();
OGLString fragText = fragSources.getText();

//关联着色器
glShaderSource(vertSahder,1,(const GLchar **)&vertText,NULL);
glShaderSource(fragShader,1,(const GLchar **)&fragText,NULL);

四.编译着色器

glCompileShader(vertSahder);
glCompileShader(fragShader);

//这里检查编译是否成功
GLint status;
glGetShaderiv(vertSahder,GL_COMPILE_STATUS,&status);
if(status!=GL_TRUE){
    println("顶点着色器编译失败");
    exit(EXIT_FAILURE);
}

glGetShaderiv(fragShader,GL_COMPILE_STATUS,&status);
if(status!=GL_TRUE){
    println("片元着色器编译失败");
    exit(EXIT_FAILURE);
}

五.创建程序

GLuint program;
program = glCreateProgram();


六.关联着色器到程序对象

glAttachShader(program,vertSahder);
glAttachShader(program,fragShader);

七.链接程序

glLinkProgram(program);

//检查是否链接错误
glGetProgramiv(program,GL_LINK_STATUS,&status);
if(status!=GL_TRUE){
    println("程序链接失败");
    exit(EXIT_FAILURE);
}

八.激活和关闭着色器程序

我们在使用着色器之前应该将着色器程序设置为活动的

glUseProgram(program);

在关闭着色器时只需要传入参数0即可

glUseProgram(0);

九.删除着色器和程序

我们在使用完毕后需要删除着色器与着色器程序,删除着色器程序对象仅仅是解除了它与着色器的关联,这些着色器仍然可以继续使用。

所以我们需要在删除程序之后再删除着色器。假如我们先调用了删除着色器的方法,实际着色器并不会被删除,直到其与着色器程序的关联被解除才会被真正的删除。

glDeleteProgram(program);
glDeleteShader(vertSahder);
glDeleteShader(fragShader);

十三.猜你喜欢

  1. OpenGL ES 简介
  2. OpenGL ES 版本介绍
  3. OpenGL ES 2.0 和 3.0区别
  4. OpenGL ES 名词解释(一)
  5. OpenGL ES 名词解释(二)
  6. OpenGL ES GLSL 着色器使用过程

未经允许不得转载:猿说编程 » OpenGL ES GLSL 着色器使用过程
喜欢(3) 打赏

评论抢沙发

评论前必须登录!

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏