GLES20.glVertexAttribPointer的五个参数分别代表什么,一般怎么填写
时间: 2023-11-15 15:22:14 浏览: 40
VertexAttribPointer的五个参数分别代表顶点坐标数据的大小,数据类型,是否归一化,步长,以及缓冲区偏移量。一般情况下,第一个参数需要填写顶点坐标的维度,一般为3(x,y,z),第二个参数需要填写数据类型,如GL_FLOAT,第三个参数需要填写是否归一化,一般为false,第四个参数需要填写步长,即每个数据间间隔字节数,一般为0,即连续存取,第五个参数需要填写缓冲区偏移量。
相关问题
解释一下 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); } }
这段代码是一个构造函数,用于初始化渲染器和相关对象。具体来说,它执行以下操作:
1. 调用GLES20.glClearColor()方法,设置清空屏幕时所用的颜色。这里设置为黑色,如果Vuforia引擎需要Alpha通道,则Alpha通道设置为0,否则为1。
2. 对于mTextures列表中的每个纹理对象t,调用GLES20.glGenTextures()方法生成纹理ID,然后绑定纹理并设置纹理参数。接着,调用GLES20.glTexImage2D()方法将纹理数据加载到OpenGL ES中。
3. 调用SampleUtils.createProgramFromShaderSrc()方法,创建着色器程序。这个方法接收两个参数,分别是顶点着色器和片段着色器的代码。
4. 调用GLES20.glGetAttribLocation()方法,获取顶点位置和纹理坐标的句柄(handle),这些句柄被用于在GPU中进行渲染。
5. 调用GLES20.glGetUniformLocation()方法,获取uniform变量的句柄,这些变量是在着色器程序中定义的,用于在GPU中进行投影和纹理处理等操作。
6. 如果mModelIsLoaded为false,说明模型还未加载。这时,它会创建一个Teapot对象和一个xyz1对象,并且尝试从Assets文件夹中加载Buildings.txt文件,用于渲染建筑模型。如果加载失败,它会输出错误信息。如果加载成功,mModelIsLoaded被设置为true。
7. 最后,它隐藏Loading Dialog,表示初始化完成。
gles20.glviewport
gles20.glviewport是OpenGL ES 2.0中的一个函数,其作用是设置视口的位置和大小。视口指的是我们看到的屏幕范围,也就是我们在屏幕上看到的画面部分。OpenGL ES 2.0中默认的视口大小是和屏幕大小相同的,但我们可以使用这个函数来改变它的大小或者位置。
使用这个函数需要传递4个参数,它们分别是起点x、起点y、宽度和高度。这些参数的单位是像素,且所有的屏幕坐标都是以左下角为原点。我们可以通过改变这些参数来设置视口的大小和位置。比如说,如果我们想让视口在屏幕的中心,我们可以将起点x设为屏幕宽度的一半,起点y设为屏幕高度的一半,宽度和高度则根据需要来进行调整。
在OpenGL ES 2.0中,视口大小和位置的变化会影响到我们所绘制的图形的显示。如果我们不修改视口,那么OpenGL ES 2.0会默认将视口设置成与屏幕大小相同的大小,并在从投影空间向屏幕空间转换的时候,对顶点坐标进行缩放和映射,以便让它们显示在正确的位置。而如果我们修改了视口的大小和位置,OpenGL ES 2.0则会根据新的设置对顶点坐标进行缩放和映射,以便让它们在新的视口中正确地显示。
总的来说,gles20.glviewport是OpenGL ES 2.0中一个非常重要的函数,它可以让我们根据需要对视口进行设置,以便让我们的绘制内容正确地显示在屏幕上。