曲阜网站建设哪家便宜,wordpress 在线运行,网站建设的公司有哪些方面,网络营销课程培训机构GLES20.glTexParameteri
GLES20.glTexParameteri是OpenGL ES 2.0用于设置纹理过滤器和纹理包装模式的函数。它有三个参数#xff1a;
target参数
target参数指定要设置纹理参数的纹理目标#xff0c;根据不同的target值#xff0c;glTexParameteri函数的行为也会有所不同…GLES20.glTexParameteri
GLES20.glTexParameteri是OpenGL ES 2.0用于设置纹理过滤器和纹理包装模式的函数。它有三个参数
target参数
target参数指定要设置纹理参数的纹理目标根据不同的target值glTexParameteri函数的行为也会有所不同。下面是几种常见的target类型及其应用场景 GLES20.GL_TEXTURE_2D二维纹理目标。适用于大多数的纹理贴图例如游戏中的角色、地图、天空等。
GLES20.GL_TEXTURE_CUBE_MAP立方体纹理目标。适用于渲染立方体贴图例如游戏中的天空盒、反射贴图等。
GLES20.GL_TEXTURE_EXTERNAL_OES用于外部纹理目标一般用于媒体流、相机等场景。可以使用SurfaceTexture将纹理输出到屏幕或其他纹理中。
GLES20.GL_TEXTURE_3D三维纹理目标。适用于体积渲染例如医学影像、地质勘探等。
GLES31.GL_TEXTURE_BUFFER缓冲区纹理目标。适用于从缓冲区中读取数据并渲染。
GLES31.GL_TEXTURE_RECTANGLE矩形纹理目标。可以用于需要快速绘制2D图形的场景例如UI渲染、HUD显示等。
GLES30.GL_TEXTURE_2D_ARRAY二维数组纹理目标。适用于渲染大量的重叠或不同分辨率的纹理例如地图瓦片、卫星图像等。
GLES31.GL_TEXTURE_CUBE_MAP_ARRAY立方体贴图数组目标。适用于同时渲染多个立方体贴图例如游戏中的动态天空、多视角渲染等。
总之不同的纹理目标适用于不同的场景开发者需要根据具体的需求选择合适的目标类型以达到最佳的渲染效果和性能。
pname
参数指定了要设置的纹理参数的名称可以是以下值之一 GL_TEXTURE_MIN_FILTER 指定当纹理被缩小时如何过滤纹理像素可以是GL_NEAREST(最近邻过滤)、GL_LINEAR(线性过滤)、GL_NEAREST_MIPMAP_NEAREST(使用最近邻过滤的Mipmap纹理)、GL_NEAREST_MIPMAP_LINEAR(使用线性过滤的Mipmap纹理)、GL_LINEAR_MIPMAP_NEAREST(使用最近邻过滤的Mipmap纹理)或GL_LINEAR_MIPMAP_LINEAR(使用线性过滤的Mipmap纹理)。
GL_TEXTURE_MAG_FILTER 指定当纹理被放大时如何过滤纹理像素可以是GL_NEAREST(最近邻过滤)或GL_LINEAR(线性过滤)。
GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T 指定纹理坐标超出范围时应如何处理可以是GL_CLAMP_TO_EDGE(纹理坐标会被截断为范围内的最大/最小值)、GL_REPEAT(纹理坐标将被重复)或GL_MIRRORED_REPEAT(纹理坐标将被重复但是在每次重复时都会镜像翻转)。
param
参数指定了纹理参数的值根据设置的参数不同可以有不同的取值例如 GL_NEAREST使用最近邻过滤。
GL_LINEAR使用线性过滤。
GL_CLAMP_TO_EDGE纹理坐标会被截断为范围内的最大/最小值。
GL_REPEAT纹理坐标将被重复。
GL_MIRRORED_REPEAT纹理坐标将被重复但是在每次重复时都会镜像翻转。
总之GLES20.glTexParameteri函数可以用来控制纹理如何被过滤和包装以及如何在纹理坐标超出范围时进行处理。 GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE)GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE)Matrix.setIdentityM
Matrix.setIdentityM() 是 Android 的一个矩阵操作方法它用于将一个矩阵设置为单位矩阵。单位矩阵是一个主对角线上所有元素都为1其余元素都为0的方阵。
该方法的完整签名如下
public static void setIdentityM(float[] sm, int smOffset)
其中参数 sm 表示一个float类型的一维数组它是要被设置为单位矩阵的目标矩阵。参数 smOffset 表示要设置的目标矩阵的起始位置。
该方法将目标矩阵从起始位置开始的元素设置为单位矩阵。由于Java中的数组下标从0开始因此第一个元素的索引是 smOffset而不是1。
以下是该方法的实现示例
public static void setIdentityM(float[] sm, int smOffset) {for (int i 0; i 16; i) {sm[smOffset i] ((i % 5 0) ? 1.0f : 0.0f);}
}
该实现通过一个循环遍历了矩阵的所有元素。对于每个元素如果它在主对角线上则将其设置为1否则设置为0。
使用该方法可以方便地将一个矩阵设置为单位矩阵从而方便后续的矩阵操作。
Matrix.setIdentityM(stMatrix, 0);将矩阵 stMatrix 设置为单位矩阵。单位矩阵是一种特殊的矩阵它不改变顶点的位置或方向。
为什么要调用setIdentityM设置为单位矩阵 在 OpenGL 中变换矩阵是用来对 3D 场景中的顶点进行变换的。每个变换操作例如平移、旋转、缩放等都可以表示为一个矩阵这些矩阵可以组合使用来实现复杂的变换效果。
在进行变换矩阵的组合时必须确保在最初的状态下即没有进行任何变换时变换矩阵的值是正确的。如果不是这样那么组合变换操作时可能会导致意外的结果。
因此在设置任何其他的变换操作之前通常需要先将变换矩阵初始化为一个单位矩阵。单位矩阵是一种特殊的矩阵它可以确保在组合变换操作时不会对顶点进行任何意外的变换。
因此首先调用 Matrix.setIdentityM(stMatrix, 0) 方法将 stMatrix 矩阵设置为单位矩阵以确保在应用任何其他变换之前矩阵的值是正确的。
每次执行矩阵操作之前都需要调用setIdentityM吗 在大多数情况下不需要在每次执行变换矩阵操作之前都调用 setIdentityM 方法。通常情况下只需要在创建变换矩阵时调用一次 setIdentityM 方法来初始化矩阵即可。
在接下来的变换操作中可以直接对这个矩阵进行修改。例如如果需要对一个顶点进行平移和旋转可以先创建一个矩阵然后使用 translateM 方法对其进行平移操作使用 rotateM 方法对其进行旋转操作。在进行每个操作之前不需要再调用 setIdentityM 方法。
但是如果在多个变换操作之间需要重新开始例如在处理多个对象时可能需要将变换矩阵重置为单位矩阵然后重新开始应用变换操作。在这种情况下可以再次使用 setIdentityM 方法来将矩阵重置为单位矩阵。
Matrix.scaleM
用于将一个缩放矩阵应用于给定的矩阵。它的参数如下
public static void scaleM(float[] m, int mOffset, float x, float y, float z)
m要被缩放的矩阵表示为一个长度为 16 的浮点数数组。 mOffset矩阵中第一个元素的偏移量。 xx 轴的缩放因子。 yy 轴的缩放因子。 zz 轴的缩放因子。
这些参数的含义如下 m这是一个长度为 16 的浮点数数组表示要进行缩放操作的矩阵。缩放矩阵会将矩阵的每个元素乘以一个缩放因子从而使得矩阵中的每个向量在对应的轴上被缩放。矩阵中的元素按照以下方式排列
m[0] m[4] m[8] m[12]
m[1] m[5] m[9] m[13]
m[2] m[6] m[10] m[14]
m[3] m[7] m[11] m[15]
mOffset这是矩阵中第一个元素的偏移量。如果要对整个矩阵进行缩放操作则将 mOffset 设置为 0。如果只想缩放矩阵的一部分可以将 mOffset 设置为相应的偏移量。 x这是要应用于 x 轴的缩放因子。这个因子应该是一个浮点数通常是大于 0 的数。如果该值为 1则不会对矩阵进行任何缩放。如果该值大于 1则会使矩阵在 x 轴方向上扩大如果该值小于 1则会使矩阵在 x 轴方向上缩小。 y这是要应用于 y 轴的缩放因子其含义与 x 轴相同。 z这是要应用于 z 轴的缩放因子其含义与 x 轴相同。 使用这些参数Matrix.scaleM() 方法将计算一个缩放矩阵并将其应用于给定的矩阵中。
针对于mOffset参数的理解 假设我们有一个 4x4 的矩阵 matrix它表示了一个对象的变换矩阵我们只想对这个矩阵的旋转部分进行缩放操作而不想影响矩阵的平移部分。这时我们可以将 mOffset 设置为矩阵中旋转部分的起始位置然后调用 Matrix.scaleM() 方法对旋转部分进行缩放。
例如假设我们的矩阵中的前三列表示了对象的旋转部分而最后一列表示了对象的平移部分。我们可以将 mOffset 设置为 0然后将 x、y、z 缩放因子设置为 1、2、1以便只对旋转部分进行 y 轴方向上的缩放
Matrix.scaleM(matrix, 0, 1, 2, 1);
这个方法会将矩阵的前三列中的所有元素乘以 1、2、1从而对旋转部分进行 y 轴方向上的缩放。由于我们将 mOffset 设置为 0因此这个操作只会影响前三列的元素而不会影响最后一列的元素。这样我们就可以只对矩阵的一部分进行缩放而不影响其他部分。
glGetUniformLocation
Uniform变量是在着色器之间共享的全局变量它们可以在多个绘制调用之间保持不变。可以使用glGetUniformLocation函数获取Uniform变量的位置以便更新它们的值。
glGetUniformLocation函数的定义如下
GLint glGetUniformLocation(GLuint program, const GLchar* name);
其中program参数是一个已经连接的着色器程序对象的标识符name参数是Uniform变量的名称。该函数返回Uniform变量的位置如果Uniform变量未被找到则返回-1。
例如如果我们有以下的顶点着色器
#version 330uniform mat4 modelViewProjectionMatrix;layout(location 0) in vec4 position;void main()
{gl_Position modelViewProjectionMatrix * position;
}
我们可以使用以下代码获取Uniform变量的位置并将其更新为一个新的4x4矩阵
GLuint program // 已连接的着色器程序对象
GLint matrixLocation glGetUniformLocation(program, modelViewProjectionMatrix);float matrixData[16] // 新的4x4矩阵数据
glUniformMatrix4fv(matrixLocation, 1, GL_FALSE, matrixData);
在这个例子中我们首先使用glGetUniformLocation函数获取了Uniform变量的位置。然后我们使用glUniformMatrix4fv函数将新的4x4矩阵数据传递给该Uniform变量。glUniformMatrix4fv函数指定了Uniform变量的位置、要更新的矩阵数量、是否要转置矩阵数据以及矩阵数据的指针。
总之glGetUniformLocation是一个很有用的函数它使得我们能够在OpenGL程序中动态更新Uniform变量。