#version 430 | |
#extension GL_3DL_array_objects : enable | |
int a = 0xffffffff; // 32 bits, a gets the value -1 | |
int b = 0xffffffffU; // ERROR: can't convert uint to int | |
uint c = 0xffffffff; // 32 bits, c gets the value 0xFFFFFFFF | |
uint d = 0xffffffffU; // 32 bits, d gets the value 0xFFFFFFFF | |
int e = -1; // the literal is "1", then negation is performed, | |
// and the resulting non-literal 32-bit signed | |
// bit pattern of 0xFFFFFFFF is assigned, giving e | |
// the value of -1. | |
uint f = -1u; // the literal is "1u", then negation is performed, | |
// and the resulting non-literal 32-bit unsigned | |
// bit pattern of 0xFFFFFFFF is assigned, giving f | |
// the value of 0xFFFFFFFF. | |
int g = 3000000000; // a signed decimal literal taking 32 bits, | |
// setting the sign bit, g gets -1294967296 | |
int h = 0xA0000000; // okay, 32-bit signed hexadecimal | |
int i = 5000000000; // ERROR: needs more than 32 bits | |
int j = 0xFFFFFFFFF; // ERROR: needs more that 32 bits | |
int k = 0x80000000; // k gets -2147483648 == 0x80000000 | |
int l = 2147483648; // l gets -2147483648 (the literal set the sign bit) | |
float fa, fb = 1.5; // single-precision floating-point | |
double fc, fd = 2.0LF; // double-precision floating-point | |
vec2 texcoord1, texcoord2; | |
vec3 position; | |
vec4 myRGBA; | |
ivec2 textureLookup; | |
bvec3 less; | |
mat2 mat2D; | |
mat3 optMatrix; | |
mat4 view, projection; | |
mat4x4 view; // an alternate way of declaring a mat4 | |
mat3x2 m; // a matrix with 3 columns and 2 rows | |
dmat4 highPrecisionMVP; | |
dmat2x4 dm; | |
struct light { | |
float intensity; | |
vec3 position; | |
} lightVar; | |
struct S { float f; }; | |
struct T { | |
//S; // Error: anonymous structures disallowed | |
//struct { ... }; // Error: embedded structures disallowed | |
S s; // Okay: nested structures with name are allowed | |
}; | |
float frequencies[3]; | |
uniform vec4 lightPosition[4]; | |
light lights[]; | |
const int numLights = 2; | |
light lights[numLights]; | |
in vec3 normal; | |
centroid in vec2 TexCoord; | |
invariant centroid in vec4 Color; | |
noperspective in float temperature; | |
flat in vec3 myColor; | |
noperspective centroid in vec2 myTexCoord; | |
uniform vec4 lightPosition; | |
uniform vec3 color = vec3(0.7, 0.7, 0.2); // value assigned at link time | |
in Material { | |
smooth in vec4 Color1; // legal, input inside in block | |
smooth vec4 Color2; // legal, 'in' inherited from 'in Material' | |
vec2 TexCoordA; // legal, TexCoord is an input | |
uniform float Atten; // illegal, mismatched storage qualifier | |
}; | |
in Light { | |
vec4 LightPos; | |
vec3 LightColor; | |
}; | |
in ColoredTexture { | |
vec4 Color; | |
vec2 TexCoord; | |
} Materiala; // instance name | |
vec3 Color; // different Color than Material.Color | |
in vec4 gl_FragCoord; // redeclaration that changes nothing is allowed | |
// All the following are allowed redeclaration that change behavior | |
layout(origin_upper_left) in vec4 gl_FragCoord; | |
layout(pixel_center_integer) in vec4 gl_FragCoord; | |
layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; | |
layout(early_fragment_tests) in; | |
// compute shader: | |
layout (local_size_x = 32, local_size_y = 32) in; | |
layout (local_size_x = 8) in; | |
layout(location = 3) out vec4 color; | |
layout(location = 3, index = 1) out vec4 factor; | |
layout(location = 2) out vec4 colors[3]; | |
layout (depth_greater) out float gl_FragDepth; | |
// redeclaration that changes nothing is allowed | |
out float gl_FragDepth; | |
// assume it may be modified in any way | |
layout (depth_any) out float gl_FragDepth; | |
// assume it may be modified such that its value will only increase | |
layout (depth_greater) out float gl_FragDepth; | |
// assume it may be modified such that its value will only decrease | |
layout (depth_less) out float gl_FragDepth; | |
// assume it will not be modified | |
layout (depth_unchanged) out float gl_FragDepth; | |
in vec4 gl_Color; // predeclared by the fragment language | |
flat in vec4 gl_Color; // redeclared by user to be flat | |
float[5] foo(float[5]) | |
{ | |
return float[5](3.4, 4.2, 5.0, 5.2, 1.1); | |
} | |
precision highp float; | |
precision highp int; | |
precision mediump int; | |
precision highp float; | |
void main() | |
{ | |
{ | |
float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); | |
} | |
{ | |
float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1); // same thing | |
} | |
{ | |
vec4 a[3][2]; // size-3 array of size-2 array of vec4 | |
vec4[2] a1[3]; // size-3 array of size-2 array of vec4 | |
vec4[3][2] a2; // size-3 array of size-2 array of vec4 | |
vec4 b[2] = vec4[2](vec4(0.0), vec4(0.1)); | |
vec4[3][2] a3 = vec4[3][2](b, b, b); // constructor | |
void foo(vec4[3][2]); // prototype with unnamed parameter | |
vec4 a4[3][2] = {vec4[2](vec4(0.0), vec4(1.0)), | |
vec4[2](vec4(0.0), vec4(1.0)), | |
vec4[2](vec4(0.0), vec4(1.0)) }; | |
} | |
{ | |
float a[5]; | |
{ | |
float b[] = a; // b is explicitly size 5 | |
} | |
{ | |
float b[5] = a; // means the same thing | |
} | |
{ | |
float b[] = float[](1,2,3,4,5); // also explicitly sizes to 5 | |
} | |
a.length(); // returns 5 | |
} | |
{ | |
vec4 a[3][2]; | |
a.length(); // this is 3 | |
a[x].length(); // this is 2 | |
} | |
// for an array b containing a member array a: | |
b[++x].a.length(); // b is never dereferenced, but ++x is evaluated | |
// for an array s of a shader storage object containing a member array a: | |
s[x].a.length(); // s is dereferenced; x needs to be a valid index | |
// | |
//All of the following declarations result in a compile-time error. | |
//float a[2] = { 3.4, 4.2, 5.0 }; // illegal | |
//vec2 b = { 1.0, 2.0, 3.0 }; // illegal | |
//mat3x3 c = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) }; // illegal | |
//mat2x2 d = { 1.0, 0.0, 0.0, 1.0 }; // illegal, can't flatten nesting | |
//struct { | |
// float a; | |
// int b; | |
//} e = { 1.2, 2, 3 }; // illegal | |
struct { | |
float a; | |
int b; | |
} e = { 1.2, 2 }; // legal, all types match | |
struct { | |
float a; | |
int b; | |
} e = { 1, 3 }; // legal, first initializer is converted | |
//All of the following declarations result in a compile-time error. | |
//int a = true; // illegal | |
//vec4 b[2] = { vec4(0.0), 1.0 }; // illegal | |
//mat4x2 c = { vec3(0.0), vec3(1.0) }; // illegal | |
//struct S1 { | |
// vec4 a; | |
// vec4 b; | |
//}; | |
//struct { | |
// float s; | |
// float t; | |
//} d[] = { S1(vec4(0.0), vec4(1.1)) }; // illegal | |
{ | |
float a[] = float[](3.4, 4.2, 5.0, 5.2, 1.1); | |
float b[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; | |
float c[] = a; // c is explicitly size 5 | |
float d[5] = b; // means the same thing | |
} | |
{ | |
const vec3 zAxis = vec3 (0.0, 0.0, 1.0); | |
const float ceiling = a + b; // a and b not necessarily constants | |
} | |
{ | |
in vec4 position; | |
in vec3 normal; | |
in vec2 texCoord[4]; | |
} | |
{ | |
lowp float color; | |
out mediump vec2 P; | |
lowp ivec2 foo(lowp mat3); | |
highp mat4 m; | |
} | |
} |