OpenGL 与 GLSL 版本号

来自:https://github.com/mattdesl/lwjgl-basics/wiki/GLSL-Versions

You can use the #version command as the first line of your shader to specify GLSL version:

#version 120

void main() {
    gl_FragColor = vec4(1.0);
}

GLSL versions are released alongside GL versions. See the following charts to decide which version you would like to target.

GLSL Versions

OpenGL Version GLSL Version
2.0 110
2.1 120
3.0 130
3.1 140
3.2 150
3.3 330
4.0 400
4.1 410
4.2 420
4.3 430

GLSL ES Versions (Android, iOS, WebGL)

OpenGL ES has its own Shading Language, and the versioning starts fresh. It is based on OpenGL Shading Language version 1.10.

OpenGL ES Version GLSL ES Version
2.0 100
3.0 300

So, for example, if a feature is available in GLSL 120, it probably won‘t be available in GLSL ES 100 unless the ES compiler specifically allows it.

Differences at a Glance

Differences between (desktop) GLSL versions.

Version 100

Vertex shader:

uniform mat4 projTrans;

attribute vec2 Position;
attribute vec2 TexCoord;

varying vec2 vTexCoord;

void main() {
    vTexCoord = TexCoord;
    gl_Position = u_projView * vec4(Position, 0.0, 1.0);
}

Fragment shader:

uniform sampler2D tex0;

varying vec2 vTexCoord;

void main() {
    vec4 color = texture2D(tex0, vTexCoord);
    gl_FragColor = color;
}

Version 330

As of GLSL 130+, in and out are used instead of attribute and varying. GLSL 330+ includes other features like layout qualifiers and changes texture2D to texture.

Vertex shader:

#version 330

uniform mat4 projTrans;

layout(location = 0) in vec2 Position;
layout(location = 1) in vec2 TexCoord;

out vec2 vTexCoord;

void main() {
    vTexCoord = TexCoord;
    gl_Position = u_projView * vec4(Position, 0, 1);
}

Fragment shader:

#version 330
uniform sampler2D tex0;

in vec2 vTexCoord;

//use your own output instead of gl_FragColor
out vec4 fragColor;

void main() {
    //‘texture‘ instead of ‘texture2D‘
    fragColor = texture(tex0, vTexCoord);
}

Other Significant Changes

GLSL 120 Additions

  • You can initialize arrays within a shader, like so:
float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
float b[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);

However, the above is not supported on Mac OSX Snow Leopard, even with GLSL 120.(1)

  • You can initialize uniforms in a shader, and the value will be set at link time:
uniform float val = 1.0;
  • You can use built-ins like sin() when setting a const value
  • Integers are implicitly converted to floats when necessary, for example:
float f = 1.0; <-- valid
float g = 1; <-- only supported in GLSL 120
vec2 v = vec2(1, 2.0); <-- only supported in GLSL 120
  • You can use f to define a float: float f = 2.5f;

GLSL 130 Additions

  • int and uint support (and bitwise operations with them)
  • switch statement support
  • New built-ins: trunc()round()roundEven()isnan()isinf()modf()
  • Fragment output can be user-defined
  • Input and output is declared with in and out syntax instead of attribute andvarying

GLSL 150 Additions

  • texture() should now be used instead of texture2D()

GLSL 330 Additions

  • Layout qualifiers can declare the location of vertex shader inputs and fragment shader outputs, eg:
layout(location = 2) in vec3 values[4];

Formally this was only possible with ARB_explicit_attrib_location extension

时间: 2024-11-04 16:30:36

OpenGL 与 GLSL 版本号的相关文章

OpenGL 与 GLSL 版本

来自:https://github.com/mattdesl/lwjgl-basics/wiki/GLSL-Versions You can use the #version command as the first line of your shader to specify GLSL version: #version 120 void main() { gl_FragColor = vec4(1.0); } GLSL versions are released alongside GL v

OpenGL与GLSL版本说明

OpenGL 4.6 (API Core Profile) (API Compatibility Profile) OpenGL Shading Language 4.60 Specification OpenGL 4.5 (API Core Profile) (API Compatibility Profile) OpenGL Shading Language 4.50 Specification OpenGL 4.4 (API Core Profile) (API Compatibility

OpenGL的版本号历史和发展

来源请注明.本文永久地址为http://www.cnblogs.com/vertexshader/articles/2917540.html OpenGL®作为业界最为广泛使用的2D和3D图形接口标准.应用在成千上万的各式各样的计算机的程序中.从初期的崭露头角,到与Direct3D激烈竞争.后经历黯淡被Khronos接手又发扬光大.已经历经波折发展了20年. 由于过去的黯淡.至今甚至仍有人站在错误的时间角度觉得它是落后的--它从未停止它前进的步伐,这篇文章就来简述OpenGL的版本号历史和发展.

[OpenGL红宝书]第一章 OpenGL概述

第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向OpenGL传输数据 42 将传输数据到OpenGL 43 顶点着色 44 细分着色 45 几何着色 46 图元装配 47 剪切 48 光栅化 49 片元着色 410 逐片元的操作 5 第一个程序深入分析 51 进入main函数 52 OpenGL的初始化过程 初始化顶点数组对象 分配顶点缓存对象 将数

android openGL ES2 一切从绘制纹理開始

纹理.在openGL中,能够理解为载入到显卡显存中的图片.Android设备在2.2開始支持openGL ES2.0.从前都是ES1.0 和 ES1.1的版本号.简单来说,openGL ES是为了嵌入设备进行功能剪裁后的openGL版本号.ES2.0是和1.x版本号不兼容的,差别和兼容性參见android 官方文档. 首先,android使用openGL提供了特殊的view作为基础叫做GLSurfaceView.我们的view须要继承GLSurfaceView.例如以下简单演示样例: publi

OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

       OpenGL ES和OpenGL的图标 关于"OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out"这个问题,做一阐述: 1.关键字的小修改大概由如下两点决定 第一,先考虑一个成本原则 一个关键字的定义是否修改,是由熟练程序员在使用该关键字时的思维成本来决定的. 当然,还有一个原则,是由初学者的学习成本来决定的,这时一条市场原则(微软喜欢这个原则). attribute改成in,varying 改成out,恰巧符合上面两条原

Windows7+VS2012下OpenGL 4的环境配置

1)确定系统支持的OpenGL版本 GPU Caps Viewer检查机器最高支持的OpenGL及GLSL版本 下载源:http://www.geeks3d.com/20161107/gpu-caps-viewer-1-32-0-released/ 2)下载必须的源码和环境 GLEW用来管理和载入OpenGL的各种扩展库 下载源:https://sourceforge.net/projects/glew/files/glew/1.12.0/glew-1.12.0.zip/download GLF

查看OpenGL版本信息

查看OpenGL版本信息 执行如下代码 1 #include "stdafx.h" 2 #include <iostream> 3 #include <gl/glut.h> 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 glutInit(&argc, (char**)argv); 8 //显示模式初始化 9 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPT

OpenGL(八)使用 subroutine 切换可编程管线

Subroutine 功能是在OpenGL 4.0 版本号里才添加的.因此对于各种Android手机.这个功能基本跪了.假设你发现你的程序报错:ARB_shader_subroutine.那就说明当前显卡不支持.只是大体思路能够了解一下.由于思路相似的功能有其它的实现方式. 原理 在shader中声明一个函数变量,然后定义它的指针,并将其作为一个uniform变量公开出去.最后定义非常多复写函数就可以. 实现 由于版本号限制.使用 subroutine 要注意在shader中添加版本号的编译宏: