首页 > 其他分享 >OpenGL-GLES 1.x

OpenGL-GLES 1.x

时间:2023-02-17 16:23:55浏览次数:42  
标签:OpenGL Shader GLES 编译 Program 着色器 shader

首先了解下着色器:着色器是一段包含着色信息的源代码字符串,分为顶点着色器和片元着色器,两个着色器分别写在不同的文件中。

着色器代码和OpenGL代码不是一起编译的,OpenGL代码是和工程一起编译,但是着色器代码是在运行期编译的。

 

在OpenGL中,存在Program和Shader两个概念。

Program:当前渲染管线所使用的程序,是Shader的容器,可以挂载多个Shader。

Shader:相当于一个模块,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。

 

整个流程其实就是创建Shader和创建Program两个子流程。

创建Shader的流程如下:

glCreateShader():创建一个Shader对象。

glShaderSource():创建加载Shader脚本源码。

glCompileShader():编译Shader脚本,compiler的part0和part1阶段。

然后创建好的Shader挂载到Program中,创建Program的流程如下:

glCreateProgram():创建一个Program对象。

glAttachShader():将创建好的Shader进行挂载。

glLinkProgram():执行链接操作,compiler的part2阶段,该阶段有很多类似LTO的多shader的优化。

最后在需要使用Shader时,调用glUseerProgram()应用当前Shader,glDrawElements() 画出对应的draw。

 

GLES1.x版本

但是在GLES1.x版本中,是固定功能流水管线的,因此没有program,提供固定模式的shader供用户选择。

固定模式的shader在预编译prebuild阶段已经编译完成。

用户会定义shader state,并通过Driver传给compiler,compiler根据state选择已编译完成的vs片段拼接在一起,返回给driver,完成绘图。

 

流程:

Driver在prepare_draw的时候,根据api_version决定GLES的版本。

如果是GLES_API_2,准备program module,对应shader已经在glCompilerShader阶段编译好,生成对应的metadata。 

如果是GLES_API_1,准备生成着色器的模块,基于shader state,确定vs中哪些功能函数/特性被打开,生成metadata,并确定fs。最后通过link_program将vs和fs组成一个pipeline (此时拿到的vs fs已经是编译好的二进制)。

 

标签:OpenGL,Shader,GLES,编译,Program,着色器,shader
From: https://www.cnblogs.com/xue0708/p/15689859.html

相关文章

  • OpenGL ES 2.0编程指导阅读笔记(七)图元装配和光栅化
    图元装配阶段在顶点着色之后,在图元装配阶段执行裁剪、透视变换和视窗变换。光栅化是将图元转换成一系列两位片元的过程。图元OpenGLES2.0中可以绘制的图元有三角形、......
  • 【题解】CF364E Empty Rectangles
    题目分析:如果题目放在序列上,也就是询问一个长度为\(n\)的序列有多少个子段满足其和为\(k\),那么考虑应该怎么做。显然就是使用分治,即左边的答案+右边的答案+跨过中间的......
  • 【OpenGL+Qt 学习】 你好,三角形
    参考LearnOpenGLCN(learnopengl-cn.github.io)1-2VAO与VBO_哔哩哔哩_bilibili定义OpenGL窗口类#ifndefMYGLWIDGET_H#defineMYGLWIDGET_H#include<QOpenGLW......
  • [WPF] 使用Silk.NET绘制D3D9或OpenGL内容并完美解决空域问题。
    可扩展渲染控件实现的基本思路(D3D、OpenGL绘制所使用的基类):   首先创建一个抽象类FramebufferBase,该类主要记录当前控件宽高和图像资源。publicabstractclas......
  • 用AngleSharp & LINQPad抓取分析博客园排行榜
    AngleSharp简单介绍AngleSharp是一个.NET库使您能够解析基于尖括号的超文本,如HTML、SVG、MathML、XMLAngleSharp的一个重要方面是CSS也可以解析。同时还是开源,免费......
  • OpenGL 鼠标位置转换世界坐标系 射线实现方法
    [-1-- 1]mousex [1---1]mousey裁剪坐标系全是1-1 直接就z=1 x=2*mousex/winWidth-1; y=1-2*mousey/winHeightvec4posNDS(x,y,z,1.0......
  • OpenGL绘制球
    有俩角度a是球面点与z轴正方向夹角另一个是b是连线在xy这个面的投影与x正轴夹角 R作为球半径每个点的xyzz很好看出来就是R*cosa     R*sina得到在xy平面......
  • OpenGL API学习记录 glBlitFramebuffer
    glBlitFramebuffer将FBO中指定的东西copy到指定地方去配合bind函数使用下面例子拷贝的颜色缓存在延迟渲染时可以拷贝GL_DEPTH_BUFFER_BIT来结合正向渲染和延迟渲染glBin......
  • OpenGL API学习记录glBufferData glBuferSubData glBindBufferRange
    glBufferDataglBufferSubDataglBindBufferRange第一个参数为targetbuffer第二个这个是把buffer的内容进行修改第三个有点像malloc但这个是UBO学到的先设定好第二个参数ind......
  • OpenGL API学习记录glMapBuffer
    除了glBufferSubData还有MapBuffer这种方式来修改数据floatdata[]={0.5f,1.0f,-0.35f...};glBindBuffer(GL_ARRAY_BUFFER,buffer);//获取指针void*ptr=glMapB......