OpenGL ES -> GLSL限定符类型详解

GLSL中的限定符详解

GLSL(OpenGL Shading Language)中的限定符用于定义变量的作用域和行为。这些限定符放在变量类型之前,只能用于全局变量。与Java限定符类似,但在GLSL中没有默认限定符。
主要限定符

attribute

  • 说明:用于表示每个顶点各不相同的量。
  • 用途:用于顶点着色器中接收来自顶点数组的数据。
  • 数据类型:可以是float、vec2、vec3、vec4、mat2、mat3、mat4等。
  • 特点:只能在顶点着色器中使用,不能在片元着色器中使用。
// 顶点着色器
attribute vec4 aPosition;  // 顶点位置

void main() {
    gl_Position = aPosition;
}

uniform

  • 说明:用于对所有顶点或片元都相同的量。
  • 用途:用于向着色器传递不会随顶点变化的数据。
  • 数据类型:可以是基本类型(int, float)、向量类型、矩阵类型,甚至是结构体和数组。
  • 特点:在顶点着色器和片元着色器中都可以使用,且值在一次绘制调用中保持不变。
// 顶点着色器
uniform mat4 uMVPMatrix;   // 模型视图投影矩阵

void main() {
     gl_Position = uMVPMatrix * aPosition; // 应用投影变换
}

varying

  • 说明:表示易变量,用于顶点着色器向片元着色器传递数据。
  • 用途:将计算结果从顶点着色器传递到片元着色器。
  • 数据类型:可以是float、vec2、vec3、vec4等。
  • 特点:在顶点着色器中赋值,在片元着色器中使用,值会根据片元位置进行插值。
// 顶点着色器
attribute vec4 aPosition;
attribute vec4 aColor;
varying vec4 vColor;  // 声明varying变量

void main() {
    gl_Position = aPosition;
    vColor = aColor;  // 将顶点颜色传递给片元着色器
}
// 片元着色器
precision mediump float;
varying vec4 vColor;  // 接收从顶点着色器传来的颜色

void main() {
    gl_FragColor = vColor;  // 使用插值后的颜色
}

const

  • 说明:用于声明常量。
  • 用途:定义在着色器执行过程中不会改变的值。
  • 数据类型:可以是任何基本类型。
  • 特点:必须在声明时初始化,之后不能修改。
const float PI = 3.14159265359;
const vec3 LIGHT_DIR = vec3(0.0, 1.0, 0.0);

void main() {
    float angle = PI / 4.0;  // 使用常量
    // 其他操作
}

layout

  • 说明:用于明确指定变量的内存布局或绑定位置。
  • 用途:指定uniform变量的绑定点、顶点属性的位置、着色器输入/输出位置等。
  • 数据类型:可用于各种变量类型,包括uniform、in、out等。
  • 特点:提供了一种在着色器代码中直接指定资源位置的方法,减少了CPU端的绑定调用。
// 指定顶点属性位置
layout(location = 0) in vec3 aPosition;
layout(location = 1) in vec2 aTexCoord;

in, out, inout (GLSL 3.0+)

在较新版本的GLSL中,attributevarying被替换为inout
in:用于接收输入数据(替代attribute
out:用于输出数据(替代varying
inout:用于函数参数,表示参数既是输入也是输出

// 顶点着色器 (GLSL 3.0+)
in vec4 position;  // 替代attribute
out vec4 vColor;   // 替代varying

// 片元着色器 (GLSL 3.0+)
in vec4 vColor;    // 从顶点着色器接收
out vec4 fragColor; // 输出到帧缓冲

void main() {
    fragColor = vColor;  // 不再使用gl_FragColor
}

precision

虽然不是限定符,但precisionGLSL中重要的修饰符,用于指定变量的精度:
highp:高精度
mediump:中等精度
lowp:低精度

precision highp float;  
precision mediump float;  
precision lowp float;  

你可能感兴趣的:(OpenGL,ES,android,android,studio)