为了优化绘制的效率,减少数据的传递,于是就有了 glDrawElements 绘制方法。...glDrawElements 绘制方法 glDrawElements 方法还是需要传递顶点数据,但只需要传递物体实际上的顶点数据,也就是最少的,不重复的顶点数据。...glDrawElements 和 glDrawArrays 的对比 glDrawElements 方法的 count 的参数定义了要取多少个索引出来绘制,而且这个绘制是连续的,必须要把 count 数量的顶点绘制完...而使用 glDrawElements 方法同样会这样,采用索引不能一次不交叉的把图形全部绘制完,得采取两次绘制。...所以说,能用 glDrawElements 方式的还是要采用的。
, ver); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), ver+3); glDrawElements..., ver); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), ver+3); glDrawElements..., ver); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), ver+3); glDrawElements...line); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), line+3); glDrawElements...line); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), line+3); glDrawElements
OpenGLES2.0 编程中,用于绘制的顶点数组数据首先保存在 CPU 内存,在调用 glDrawArrays 或者 glDrawElements 等进行绘制时,需要将顶点数组数据从 CPU 内存拷贝到显存...glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (vertices + 3)); glDrawElements...GLfloat), (const void *)(3 *sizeof(GLfloat))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]); glDrawElements...glUseProgram(m_ProgramObj); glBindVertexArray(m_VaoId); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT
还好OpenGL有这样的方式: glDrawElements(); glDrawElements 函数的原型为:glDrawElements(GLenum mode, GLsizei count, GLenum...positionSlot, 3, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(_positionSlot); glDrawElements
0.5 // V3 } 我们有两个绘制顶点的方法可供选择: void glDrawArrays (GLenum mode, GLint first, GLsizei count); void glDrawElements...注意一点,如果顶点N不是3的倍数,最后一个或者两个顶点被忽略 GL_TRIANGLES 下面这个两种主要用于顶点索引,使用到的绘制函数为: void glDrawElements (GLenum...//V2 0,0,-0.5 // V3 } 坐标索引 static GLuint index[] = { 3,1,0,2,3,1 } // 执行绘制 glDrawElements...GLuint index1[5] = { 0,1,2,3,1 } static GLuint index2[3] = { 1,3,2 } 调用绘制方法的时候,需要调用两次 glDrawElements...(GL_TRIANGLE_FAN,5,GL_GL_UNSIGNED_BYTE,index1); glDrawElements(GL_TRIANGLE_FAN,3,GL_GL_UNSIGNED_BYTE,
float)screenW / screenH); glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]); glDrawElements...float)screenW / screenH); glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]); glDrawElements...* 2.5f, (float)screenW / screenH); GLUtils::setMat4(m_BlurProgramObj, "u_MVPMatrix", m_MVPMatrix); glDrawElements...float)screenW / screenH); glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]); glDrawElements...(float)screenW / screenH); GLUtils::setMat4(m_BlurProgramObj, "u_MVPMatrix", m_MVPMatrix); glDrawElements
图元 图元可以用 glDrawArrays、glDrawElements、glDrawRangeElements、glDrawArraysInstanced、glDrawElementsInstanced...性能提示 应用程序应该用 尽可能大的图元尺寸 调用 glDrawElements 和 glDrawElementsInstanced。...如果绘制带有 三角形条带(GL_TRIANGLE_STRIP)或者 扇形(GL_TRIANGLE_FAN)的网格,则可以启用 图元重启 将这些网格连接在一起,而不是单独调用glDrawElements。...对于上图 相反的顶点顺序,如果我们调用glDrawElements*** 绘制两个条带, 组合的元素索引列表为(0,1,2,3,3,8,8,9,10,10),粗体的表示组合元素索引添加的新索引。...对于 相同顶点顺序,如果我们调用glDrawElements*** 绘制两个条带, 组合的元素索引列表为(0,1,2,3,4,4,8,8,9,10,10),粗体的表示组合元素索引添加的新索引。
glUniform1i(glGetUniformLocation(self.myProgram, "colorMap"), 0); glDrawElements(GL_TRIANGLES...GL_RENDERBUFFER]; 使用coreGraphics来完成图片解压缩,这里有详细的注释iOS-使用coreGraphics进行图片解压缩 相比顶点绘制方式而言,索引绘图只有在最后的绘制API的选择上不同:glDrawElements...1, 4, //上左 1, 2, 4, //上下 2, 3, 4, //上左 0, 4, 3, //上后 }; glDrawElements
绘制数据 glDrawArrays/glDrawElements c....- (void)draw { glLineWidth(DEFAULT_LINE_WITH); if (self.drawInfo.elementIndicesCount) { glDrawElements...StartIndex, // 就是 0 self.drawInfo.verticesIndicesCount); } 其中 glLineWidth函数是修改线的宽度的; glDrawElements...所以这里要用它的兄弟函数 glDrawElements 这个函数的意思就是绘制成员,顶点数据的下标就是它的成员,即通过顶点数据的成员来访问数据而进行灵活绘制。...glDrawElements 根据顶点数据在内存的下标进行绘制的方法 glDrawElements void glDrawElements(GLenum mode, GLsizei count,GLenum
(GLES20.GL_TEXTURE_2D, textureId) GLES20.glUniform1i(textureLoc, 0) GLES20.glDrawElements...GLES20.glDrawElements是真正的绘制,函数结构如下: public static native void glDrawElements( int mode,
OpenGL ES 2.0 编程中,用于绘制的顶点数组数据首先保存在 CPU 内存,在调用 glDrawArrays 或者 glDrawElements 等进行绘制时,需要将顶点数组数据从 CPU 内存拷贝到显存...glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (vertices + 3)); glDrawElements...GLfloat), (const void *)(3 *sizeof(GLfloat))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]); glDrawElements...glUseProgram(m_ProgramObj); glBindVertexArray(m_VaoId); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT
GL_TEXTURE0); // 绑定图像纹理 glBindTexture(GL_TEXTURE_2D, m_ImageTextureId); glUniform1i(m_FboSamplerLoc, 0); glDrawElements...GL_TEXTURE0); //绑定 FBO 纹理 glBindTexture(GL_TEXTURE_2D, m_FboTextureId); glUniform1i(m_SamplerLoc, 0); glDrawElements...GL_TEXTURE_2D, m_ImageTextureId); glUniform1i(m_FboSamplerLoc, 0); GO_CHECK_GL_ERROR(); glDrawElements...glBindTexture(GL_TEXTURE_2D, m_FboTextureId); glUniform1i(m_SamplerLoc, 0); GO_CHECK_GL_ERROR(); glDrawElements
虽然glDraw开头的函数众多,不过它们大致可以分为以glDrawArrays和glDrawElements为首的两族。所有绘制指令的对象都是VAO,因此在绘制前程序需要绑定一个正确的VAO。...glEnableVertexAttribArray(0); // 绘制时 glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); // 绘制一个三角形 glDrawElements...另外,在使用glDrawElements之前,还需要给VAO绑定一个索引,在下一节中将会进行详细说明。 使用索引进行绘制的意义在于减少重复数据。...GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // 绘制时 glBindVertexArray(VAO); glDrawElements
glUniform4f(vertexColorLocation, 0, greenValue, 0, 1.0f); //glDrawArrays(GL_TRIANGLES, 0, 6); glDrawElements
OpenGL ES 2.0 编程中,用于绘制的顶点数组数据首先保存在 CPU 内存,在调用 glDrawArrays 或者 glDrawElements 等进行绘制时,需要将顶点数组数据从 CPU 内存拷贝到显存...glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (vertices + 3)); glDrawElements...(GLfloat), (const void *)(3 *sizeof(GLfloat))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]); glDrawElements...glUseProgram(m_ProgramObj); glBindVertexArray(m_VaoId); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT
} } 二、绘制三角形 这里有个坑,一开始没理解GL_TRIANGLE_STRIP,走了弯路,实际上理解了GL_TRIANGLE_STRIP,就明白代码中绘制的逻辑 glDrawElements...GL_FLOAT, GL_FALSE, stride, (void*)(5 * sizeof(float))); } glBindVertexArray(sphereVAO); glDrawElements
GL_CULL_FACE); //3 glCullFace(GL_BACK); // 剔除背面 glDrawElements...( GL_TRIANGLE_FAN, 18, GL_UNSIGNED_BYTE, tfan1); glDrawElements( GL_TRIANGLE_FAN, 18, GL_UNSIGNED_BYTE
而在调用 glDrawArrays 或者 glDrawElements 等接口进行绘制时,OpenGL 需要将顶点数组数据从 CPU 内存拷贝到 GPU 显存。...GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // 将顶点数据 (CPU 内存) 拷贝到 EBO(GPU 显存) // 绘制: glDrawElements...(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); // 使用 glDrawElements 来绘制 整个过程比 VBO 略复杂了一点,但是还是很好理解的:去掉重复顶点,通过索引指定绘制顶点
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_TextureId); glUniform1i(m_SamplerLoc, 0); glDrawElements...; sprintf(samplerName, "s_Texture%d", i); GLUtils::setInt(m_ProgramObj, samplerName, i); } glDrawElements
领取专属 10元无门槛券
手把手带您无忧上云