OpenGL ES 三种变量类型(uniform,attribute和varying)

https://blog.csdn.net/jackers679/article/details/6848085

https://zhuanlan.zhihu.com/p/103687720

1.uniform变量

uniform变量是外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过函数glUniform**()函数赋值的。在(vertex和fragment)shader程序内部,uniform变量就像是C语言里面的常量(const ),它不能被shader程序修改。(shader只能用,不能改)

如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。(相当于一个被vertex和fragment shader共享的全局变量)

uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。

uniform 变量通常是存储在GPU的”常量区”,这一区域的内存是有限的,因此uniform有个数限制,但比attribute要多很多,OpenGL 标准化组织规定OpenGL ES 2.0规定至少支持128个顶点uniform和16个片段(Fragment)uniform。 获取支持的顶点uniform最大个数代码如下:

fun getMaxVertexUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

获取支持的片段uniform最大个数代码如下:

fun getMaxFragmentUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

以下是例子:

uniform mat4 viewProjMatrix; //投影+视图矩阵
uniform mat4 viewMatrix;        //视图矩阵
uniform vec3 lightPosition;     //光源位置

2.attribute变量

attribute变量是只能在vertex shader中使用的变量。(它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。

以下是例子:

uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord;

void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}

3.varying变量

varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。application不能使用此变量。

以下是例子:

// Vertex shader
uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord; // Varying in vertex shader
void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}


// Fragment shader
precision mediump float;
varying vec2 v_texCoord; // Varying in fragment shader
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main()
{
vec4 baseColor;
vec4 lightColor;
baseColor = texture2D(s_baseMap, v_texCoord);
lightColor = texture2D(s_lightMap, v_texCoord);
gl_FragColor = baseColor * (lightColor + 0.25);
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES中,我们可以使用`glGetAttribLocation`和`glVertexAttribPointer`函数来传递矩阵数据到in变量。 首先,我们需要在着色器程序中声明一个in变量来接收矩阵数据。例如,在顶点着色器中,我们可以这样声明一个名为`uMatrix`的矩阵变量: ```glsl attribute vec4 aPosition; attribute vec2 aTexCoord; uniform mat4 uMatrix; varying vec2 vTexCoord; void main() { gl_Position = uMatrix * aPosition; vTexCoord = aTexCoord; } ``` 接下来,在我们的应用程序中,我们需要获取这个变量的位置,并将矩阵数据传递给它。具体步骤如下: 1. 获取变量的位置。我们可以使用`glGetAttribLocation`函数来获取变量的位置,例如: ```c GLuint program; // 着色器程序对象 GLint matrixLoc; // 矩阵变量位置 matrixLoc = glGetUniformLocation(program, "uMatrix"); ``` 2. 将矩阵数据传递给变量。我们可以使用`glUniformMatrix4fv`函数来将矩阵数据传递给变量,例如: ```c GLfloat matrix[16]; // 矩阵数据 // 将矩阵数据传递给变量 glUniformMatrix4fv(matrixLoc, 1, GL_FALSE, matrix); ``` 在这里,第一个参数是变量的位置,第二个参数是矩阵的数量,第三个参数指定是否需要转置矩阵,第四个参数是矩阵数据的指针。 3. 将顶点数据传递给`glVertexAttribPointer`函数。我们可以使用`glVertexAttribPointer`函数来传递顶点数据,例如: ```c GLfloat vertices[12] = { -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f }; // 绑定顶点属性 aPosition GLint positionLoc = glGetAttribLocation(program, "aPosition"); glEnableVertexAttribArray(positionLoc); glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, vertices); ``` 在这里,第一个参数是变量的位置,第二个参数是每个顶点属性的分量数,第三个参数是数据类型,第四个参数指定是否需要进行归一化,第五个参数是步长,表示相邻两个顶点的字节数,第六个参数是顶点数据的指针。 通过以上步骤,我们就可以将矩阵数据传递到in变量中了。需要注意的是,我们需要在顶点着色器中使用`uMatrix`变量来接收矩阵数据,并在顶点着色器中将顶点坐标乘以矩阵来进行变换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值