glGetAttribLocation

glGetAttribLocation


glGetAttribLocation 是一个 OpenGL 函数,用于获取指定着色器程序中属性变量的位置(索引)。它的签名如下:

GLint glGetAttribLocation(GLuint program, const GLchar *name);

其中:
program 是着色器程序对象。
name 是属性变量的名称。

返回值

在任何平台上,包括 Android x64,glGetAttribLocation 的返回值依赖于以下几个因素:

  1. 属性变量是否存在:如果指定的属性变量在给定的着色器程序中存在并且是有效的,那么 glGetAttribLocation 返回一个非负整数,表示属性位置。
  2. 属性变量是否被优化掉:如果属性变量在编译和链接过程中被优化掉了(例如,它未被使用),那么 glGetAttribLocation 可能返回 -1,表示该属性变量不存在。
  3. 着色器程序是否有效:如果着色器程序无效或未链接成功,glGetAttribLocation 可能返回 -1。

具体示例假设你有一个简单的顶点着色器如下:

#version 300 es
layout(location = 0) in vec4 aPosition;
layout(location = 1) in vec4 aColor;

void main() {
    gl_Position = aPosition;
}

在这种情况下,aPosition 的位置已经明确指定为 0,aColor 的位置指定为 1。

在 C++ 代码中,你可以使用 glGetAttribLocation 来获取这些位置:

GLuint program = ...; // 已经创建和链接的着色器程序对象
GLint positionLocation = glGetAttribLocation(program, "aPosition");
GLint colorLocation = glGetAttribLocation(program, "aColor");

c++对于上述着色器:
positionLocation 将返回 0。
colorLocation 将返回 1。

如果你请求一个不存在的属性,例如:

GLint nonExistentLocation = glGetAttribLocation(program, "aNonExistent");

那么 nonExistentLocation 将返回 -1。

注意事项

  1. 在 Android x64 平台上,glGetAttribLocation 的行为与其他平台一致。它依赖于 OpenGL ES 的实现,而不是具体的硬件架构。
  2. 确保着色器程序已经成功编译和链接。在调用 glGetAttribLocation 之前,确保你的着色器程序已经成功编译和链接,否则你可能会得到 -1。

调试
如果 glGetAttribLocation 返回 -1 且你认为属性变量应该存在,请检查以下几点:

  • 属性名称是否正确拼写。
  • 属性变量是否在着色器中使用。
  • 着色器程序是否成功编译和链接。

通过这些检查,可以确保 glGetAttribLocation 返回正确的属性位置。

解释一下 GLES20.glClearColor(0.0f, 0.0f, 0.0f, Vuforia.requiresAlpha() ? 0.0f : 1.0f); for (Texture t : mTextures) { GLES20.glGenTextures(1, t.mTextureID, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, t.mTextureID[0]); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, t.mWidth, t.mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, t.mData); } shaderProgramID = SampleUtils.createProgramFromShaderSrc( CubeShaders.CUBE_MESH_VERTEX_SHADER, CubeShaders.CUBE_MESH_FRAGMENT_SHADER); vertexHandle = GLES20.glGetAttribLocation(shaderProgramID, "vertexPosition"); // textureCoordHandle = GLES20.glGetAttribLocation(shaderProgramID, // "vertexTexCoord"); mVColorCenterHandler = GLES20.glGetUniformLocation(shaderProgramID, "vColorCenter"); mvpMatrixHandle = GLES20.glGetUniformLocation(shaderProgramID, "modelViewProjectionMatrix"); texSampler2DHandle = GLES20.glGetUniformLocation(shaderProgramID, "texSampler2D"); if(!mModelIsLoaded) { mTeapot = new Teapot(); mxyz1 = new xyz1(); try { mBuildingsModel = new SampleApplication3DModel(); mBuildingsModel.loadModel(mActivityRef.get().getResources().getAssets(), "ImageTargets/Buildings.txt"); mModelIsLoaded = true; } catch (IOException e) { Log.e(LOGTAG, "Unable to load buildings"); } // Hide the Loading Dialog mActivityRef.get().loadingDialogHandler .sendEmptyMessage(LoadingDialogHandler.HIDE_LOADING_DIALOG); } }
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值