shader内置变量:

attribute vec4 gl_Color;              // 顶点颜色
attribute vec4 gl_SecondaryColor;     // 辅助顶点颜色
attribute vec3 gl_Normal;             // 顶点法线
attribute vec4 gl_Vertex;             // 顶点物体空间坐标(未变换)
attribute vec4 gl_MultiTexCoord[0-N]; // 顶点纹理坐标(N = gl_MaxTextureCoords)
attribute float gl_FogCoord;          // 顶点雾坐标uniform mat4 gl_ModelViewMatrix;                // 模型视图变换矩阵
uniform mat4 gl_ProjectMatrix;                  // 投影矩阵
uniform mat4 gl_ModelViewProjectMatrix;         // 模型视图投影变换矩阵(ftransform())
uniform mat3 gl_NormalMatrix;                   // 法向量变换到视空间矩阵
uniform mat4 gl_TextureMatrix[gl_MatTextureCoords];     // 各纹理变换矩阵varying vec4 gl_Color;
varying vec4 gl_SecondaryColor;
varying vec4 gl_TexCoord[gl_MaxTextureCoords];
varying float gl_FogFragCoord;
gl_Position: 用于vertex shader, 写顶点位置;被图元收集、裁剪等固定操作功能所使用;其内部声明是:highp vec4 gl_Position;gl_PointSize: 用于vertex shader, 写光栅化后的点大小,像素个数;                                 其内部声明是:mediump float gl_PointSize;gl_FragColor: 用于Fragment shader,写fragment color;被后续的固定管线使用;        其内部声明是:mediump vec4 gl_FragColor;gl_FragData: 用于Fragment shader,是个数组,写gl_FragData[n] 为data n;被后续的固定管线使用; 其内部声明是:mediump                      vec4     gl_FragData[gl_MaxDrawBuffers];gl_FragColor和gl_FragData是互斥的,不会同时写入;gl_FragCoord: 用于Fragment shader,只读, Fragment相对于窗口的坐标位置 x,y,z,1/w; 这个是固定管线图元差值后产生的;z 是深度值; 其内部声明是:mediump vec4 gl_FragCoord;gl_FrontFacing: 用于判断 fragment是否属于 front-facing primitive;只读;   其内部声明是:bool gl_FrontFacing;   gl_PointCoord: 仅用于 point primitive;                                                            其内部声明是:  mediump vec2 gl_PointCoord;

shader内置常量:

const mediump int gl_MaxVertexAttribs = 8;
const mediump int gl_MaxVertexUniformVectors = 128;
const mediump int gl_MaxVaryingVectors = 8;
const mediump int gl_MaxVertexTextureImageUnits = 0;
const mediump int gl_MaxCombinedTextureImageUnits = 8;
const mediump int gl_MaxTextureImageUnits = 8;
const mediump int gl_MaxFragmentUnitformVectors = 16;
const mediump int gl_MaxDrawBuffers = 1;

shader内置函数:

  • 三角函数
 一般默认都用弧度;radians(degree) : 角度变弧度;degrees(radian) : 弧度变角度;sin(angle), cos(angle), tan(angle)asin(x): arc sine, 返回弧度 [-PI/2, PI/2];acos(x): arc cosine,返回弧度 [0, PI];atan(y, x): arc tangent, 返回弧度 [-PI, PI];atan(y/x): arc tangent, 返回弧度 [-PI/2, PI/2];
  • 数学函数
    pow(x, y): x的y次方;exp(x): 指数, log(x):exp2(x): 2的x次方, log2(x):sqrt(x): x的根号; inversesqrt(x): x根号的倒数abs(x): 绝对值sign(x): 符号, 1, 0 或 -1floor(x): 底部取整ceil(x): 顶部取整fract(x): 取小数部分mod(x, y): 取模, x - y*floor(x/y)min(x, y): 取最小值max(x, y): 取最大值clamp(x, min, max):  min(max(x, min), max);mix(x, y, a): x, y的线性混叠, x(1-a) + y*a;step(edge, x): 如 xsmoothstep(edge0, edge1, x): threshod  smooth transition时使用。 edge0<=edge0时为0.0, x>=edge1时为1.length(x): 向量长度distance(p0, p1): 两点距离, length(p0-p1);dot(x, y): 点积,各分量分别相乘 后 相加cross(x, y): 差积,x[1]*y[2]-y[1]*x[2], x[2]*y[0] - y[2]*x[0], x[0]*y[1] - y[0]*x[1]normalize(x): 归一化, length(x)=1;faceforward(N, I, Nref): 如 dot(Nref, I)< 0则N, 否则 -Nreflect(I, N): I的反射方向, I -2*dot(N, I)*N, N必须先归一化refract(I, N, eta): 折射,k=1.0-eta*eta*(1.0 - dot(N, I) * dot(N, I)); 如k<0.0 则0.0,否则 eta*I - (eta*dot(N, I)+sqrt(k))*NmatrixCompMult(matX, matY): 矩阵相乘, 每个分量 自行相乘, 即 r[i][j] = x[i][j]*y[i][j];   矩阵线性相乘,直接用 *
  • 比较函数
    lessThan(vecX, vecY): 向量 每个分量比较 x < ylessThanEqual(vecX, vecY): 向量 每个分量比较 x<=ygreaterThan(vecX, vecY): 向量 每个分量比较 x>ygreaterThanEqual(vecX, vecY): 向量 每个分量比较 x>=yequal(vecX, vecY): 向量 每个分量比较 x==ynotEqual(vecX, vexY): 向量 每个分量比较 x!=yany(bvecX): 只要有一个分量是true, 则trueall(bvecX): 所有分量是true, 则truenot(bvecX): 所有分量取反
  • 纹理采样
    texture2D(sampler2D, coord): texture lookuptexture2D(sampler2D, coord, bias): LOD bias, mip-mapped texturetexture2DProj(sampler2D, coord):texture2DProj(sampler2D, coord, bias):texture2DLod(sampler2D, coord, lod):texture2DProjLod(sampler2D, coord, lod):textureCube(samplerCube, coord):textureCube(samplerCube, coord, bias):textureCubeLod(samplerCube, coord, lod):

示例一

const char* vertexShader =
"#version 330 core\n"
"layout (location = 0) in vec2 vPos;\n"
"layout (location = 1) in float vTexCoord;\n"
"out float texCoord;\n"
"void main()\n"
"{\n"
"  gl_Position = vec4(vPos, 0.0, 1.0f);\n"
"  texCoord = vTexCoord;\n"
"}";const char* fragmentShader =
"#version 330 core\n"
"in float texCoord;\n"
"uniform float time;\n"
"float plot2(float pct, float len)\n"
"{\n"
"  return smoothstep(pct - 0.02, pct, len) - smoothstep(pct , pct+ 0.02, len);\n"
"}\n"
"void main()\n"
"{\n"
"   float t = plot2(fract(time),texCoord);\n"
"   float a = clamp(t , 0.3, 0.8);\n"
"  gl_FragColor = vec4(1.0, 0.0f, 0.0f, a);\n"
"}";

示例二

const char* vertexShader =
"#version 330 core\n"
"layout (location = 0) in vec2 vPos;\n"
"layout (location = 1) in float vTexCoord;\n"
"out float texCoord;\n"
"void main()\n"
"{\n"
"  gl_Position = vec4(vPos, 0.0, 1.0f);\n"
"  texCoord = vTexCoord;\n"
"}";const char* fragmentShader2 =
"#version 330 core\n"
"in float texCoord;\n"
"uniform float time;\n"
"const float PI = 3.1415926;\n"
"void main()\n"
"{\n"
"   float t = cos(2 * PI * 4 * (1 - texCoord + 0.5*time));\n"
"   float a = clamp(t,0.5, 0.7);\n"
"  gl_FragColor = vec4(1.0, 0.0f, 0.0f, a);\n"
"}";

主程序

int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(800, 800, "example05", nullptr, nullptr);if (window == NULL){return -1;}glfwMakeContextCurrent(window);glewInit();std::vector<Point> points;points.push_back(Point(0,0,0));constexpr float radious = 1;for (int angle = 0; angle <= 360; angle += 5){float x = radious * cos(TORADIAN(angle));float y = radious * sin(TORADIAN(angle));points.push_back(Point(x, y, 1));}GLuint VAO;GLuint VBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, points.size()*sizeof(Point), &points.front(), GL_STATIC_DRAW);glVertexAttribPointer(0, 2 , GL_FLOAT, GL_FALSE, sizeof(Point), (void*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, sizeof(Point), (void*)offsetof(Point,m_s));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);GLuint vshader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vshader, 1, &vertexShader, nullptr);glCompileShader(vshader);GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fshader, 1, &fragmentShader2, nullptr);glCompileShader(fshader);GLuint program = glCreateProgram();glAttachShader(program, vshader);glAttachShader(program, fshader);glLinkProgram(program);int success;char infoLog[512];glGetProgramiv(program, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(program, 512, NULL, infoLog);std::cout << infoLog << std::endl;}float time = 0;while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.2f, 0.6f, 0.5f, 0.7f);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);time += 0.01;glUseProgram(program);glUniform1f(glGetUniformLocation(program, "time"), time);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLE_FAN, 0, points.size());glBindVertexArray(0);glfwPollEvents();glfwSwapBuffers(window);}glDeleteBuffers(1, &VBO);glDeleteVertexArrays(1, &VAO);glDeleteShader(vshader);glDeleteShader(fshader);glDeleteProgram(program);glfwTerminate();return 0;
}

GLSL内置变量和内置函数相关推荐

  1. 如何查看python有哪些内置函数_如何查看 Python 全部内置变量和内置函数?

    查看python内置函数的方法:1.打开Python IDLE编辑器:2.输入" dir(__builtins__)"命令,按下回车键(Enter)得到Python全部内置变量和函 ...

  2. python 内置函数 builtins_如何查看 Python 全部内置变量和内置函数?

    查看python内置函数的方法:1.打开Python IDLE编辑器:2.输入" dir(__builtins__)"命令,按下回车键(Enter)得到Python全部内置变量和函 ...

  3. python内置变量__complex___Python 内置方法

    数学运算: abs:求数值的绝对值 deffunc(x,y,f):return f(x)+f(y)print(func(-1,9,abs))#输出结果:10 divmod:地板除(返回两个数值的商和余 ...

  4. Linux-awk及内置变量

    概述 awk(分析&处理) awk是一个数据处理工具,相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个"字段"来处理. 通常运行模式: awk ' 条件 ...

  5. linux内置变量大全,Linux进阶之bash编程四(内置变量)

    一:基础回顾 1:文件清空 [craft@vp143 test]$ >log.txt 2:正常和错误重定向输出 //正常和错误都追加输出到同样地方 [craft@vp143 test]$ ifc ...

  6. Python(8):模块内置变量

    写在前面 文章目录 模块内置变量 常用内置变量 __name__变量 __package__变量 __file__变量 __doc__变量 专栏目录 模块内置变量 常用内置变量 __name__变量 ...

  7. openresty 内置变量

    openresty 内置变量 官网:http://nginx.org/en/docs/varindex.html 常用内置变量 openresty 获取nginx的内置变量 nginx 内置变量:$a ...

  8. go 变量在其中一个函数中赋值 另一个函数_go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包...

    本篇文章是 Go 语言学习笔记之函数式编程系列文章的第二篇,上一篇介绍了函数基础,这一篇文章重点介绍函数的重要应用之一: 闭包 空谈误国,实干兴邦,以具体代码示例为基础讲解什么是闭包以及为什么需要闭包 ...

  9. Makefile自定义函数 / pushd,popd / ifneq / findstring / camke内置变量

    ①Makefile 自定义函数 1.自定义函数编写 自定义函数一般上是命令的集合 define func1 @echo "func name is $(0)\n" @echo &q ...

最新文章

  1. linux mysql远程链接_Linux下mysql实现远程连接
  2. 图像凸集投影法_论文分享|数字投影结构光三维测量方法研究
  3. 日志信息jar包 slf4j-api、slf4j-log4j12、log4j 之间的关系和使用
  4. Web Security——英语写作与教学评价系统(iWrite)解决写作时禁止复制粘贴问题解决方案
  5. Ucenter会员同步通讯登录原理(转)
  6. 《剑指offer》数据流中的中位数
  7. php限制只能中文,php如何实现一个账号只能有一个人登录
  8. 【nand2tetris实验0】windows找不到文件javaw的解决办法
  9. C++第一次试水写cstring类
  10. u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
  11. 如何测试硬盘软件,win10系统怎么用硬盘检测工具HDTune【图文】
  12. vmware桌面云建设项目方案建议书(包含GPU)
  13. tf卡无法格式化怎么修复?解决方法分享
  14. python列重命名
  15. uni-app图片如何设置双指放大缩小
  16. 01-RobotStudio新建系统
  17. 时代亿信 认证墙-UAP统一认证与访问控制产品
  18. 自然》子刊同期刊发两篇重磅论文:月球上的水很多-1
  19. 物理隔离下的数据交换平台难点解析与实践(一)
  20. 使用TextPad一键编译运行C++程序和JAVA程序

热门文章

  1. 阿里短信服务 php实例,阿里大鱼发送sms 短信 php demo示例
  2. 什么叫会签,内部会签,外部会签
  3. 淘宝商品类目查询方法
  4. 河北省推动城乡建设绿色发展的实施意见出台
  5. 判定给定的字符序列是否为回文【数据结构】【栈】
  6. 出现 qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in 的解决方法
  7. AWS助理架构师认证考试样题答案及解析
  8. Scanpy(六)空间转录组数据的分析与可视化
  9. 九、数组的扩展(扩展运算符)
  10. DDR4 Spec 第四章 4.14-4.15