vertexAttribPointer

语法
void gl.vertexAttribPointer(index, size, type, normalized, stride, offset);

index 指定要修改的顶点属性的索引
size 指定每个顶点属性的组成数量,必须是1,2,3或4。
type 指定数组中每个元素的数据类型
normalized 当转换为浮点数时是否应该将整数数值归一化到特定的范围
stride 一个GLsizei,以字节为单位指定连续顶点属性开始之间的偏移量(即数组中一行长度)。不能大于255。如果stride为0,则假定该属性是紧密打包的,即不交错属性,每个属性在一个单独的块中,下一个顶点的属性紧跟当前顶点之后。注意一个字节是8位,如Int16就是一个元素占两个字节,一般一个vbo只传一种类型如position,所以一般都是0
offset GLintptr (en-US)指定顶点属性数组中第一部分的字节偏移量。必须是类型的字节长度的倍数 一般一个vbo只传一种类型如position,所以一般都是0

enableVertexAttribArray

执行gl.enableVertexArray(location)后,顶点着色器才能访问到缓冲区的数据,函数实际上处理的对象是缓冲区。

使用VBO方式

VBO创建

     var position_buffer_mesh1 = null;var color_buffer_mesh1 = null;var index_buffer_mesh1 = null;function setupBuffer1() {//  1.复制索引数组到一个顶点缓冲(VAO)中,等待使用var position = [-50, -30, 0,-5, -30, 0,-5, 30, 0,-50, 30, 0];position_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);var color = [1, 0, 0,0, 1, 0,0, 0, 1,1, 0, 0];color_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);// 2.复制索引数组到一个索引缓冲(EBO)中,等待使用var index = [0, 1, 2,0, 2, 3];index_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);// 3.开启顶点属性let aVertexPosition = gl.getAttribLocation(glProgram, 'position');gl.enableVertexAttribArray(aVertexPosition);let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexColor);}

VBO使用

     function animate() {requestAnimationFrame(animate);// update uniformupdateModelViewMatrix();setAllUniforms();// 这个案例只使用了一个materiallet aVertexPosition = gl.getAttribLocation(glProgram, 'position');let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.clear(gl.COLOR_BUFFER_BIT);// draw first onegl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);draw(6);// draw second onegl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh2);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh2);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh2);draw(3);}

使用VAO

VAO的创建与绑定,可以看到就是在上面VBO创建的基础上外面包了一层,mapbox中也是以这种顺序使用的

     var position_buffer_mesh1 = null;var color_buffer_mesh1 = null;var index_buffer_mesh1 = null;var vao1 = null;function setupBuffer1() {// 1.创建VBO,并bind顶点属性数据var position = [-50, -30, 0,-5, -30, 0,-5, 30, 0,-50, 30, 0];var color = [1, 0, 0,0, 1, 0,0, 0, 1,1, 0, 0];position_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);color_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);// 2.复创建EBOvar index = [0, 1, 2,0, 2, 3];index_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);// 3.创建和绑定VAO对象vao1 = ext.createVertexArrayOES();ext.bindVertexArrayOES(vao1);let aVertexPosition = gl.getAttribLocation(glProgram, 'position');let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexPosition);gl.enableVertexAttribArray(aVertexColor);gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);ext.bindVertexArrayOES(null);}

VAO使用,可以看下面就是绘制前使用了一个ext.bindVertexArrayOES

     function animate() {requestAnimationFrame(animate);// update uniformupdateModelViewMatrix();setAllUniforms();gl.clear(gl.COLOR_BUFFER_BIT);// draw first oneext.bindVertexArrayOES(vao1);draw(6);// // draw second oneext.bindVertexArrayOES(vao2);draw(6);}

只使用VBO渲染案例(参考可以看下)

<!doctype html>
<html><head><meta charset="utf-8" /><title>Basic Draw Rectangle</title><script id="shader-vs" type="x-shader/x-vertex">// precision lowp float;
attribute vec3 position;
attribute vec3 color;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vcolor;
void main(void){vcolor = vec4(color,1.0);gl_Position = uPMatrix * uMVMatrix * vec4(position, 1.0);
}
</script><script id="shader-fs" type="x-shader/x-fragment">precision lowp float;varying vec4 vcolor;
void main(void) {gl_FragColor = vcolor;
}
</script>
</head><body><canvas id="canvas" width="400" height="400"></canvas><script type="text/javascript" src="../library/gl-matrix.js"></script><script>var gl;var canvas = document.getElementById('canvas');var pMatrix = mat4.create();var mvMatrix = mat4.create();var glProgram = null;var ext = null;function getGLContext() {var glContextNames = ['webgl', 'experimental-webgl'];for (var i = 0; i < glContextNames.length; i++) {try {gl = canvas.getContext(glContextNames[i]);} catch (e) { }if (gl) {gl.clearColor(74 / 255, 115 / 255, 94 / 255, 1.0);gl.clear(gl.COLOR_BUFFER_BIT);gl.viewport(0, 0, canvas.width, canvas.height);// ext = gl.getExtension("OES_vertex_array_object");break;}}}function initShaders() {//get shader sourcevar vs_source = document.getElementById('shader-vs').innerHTML,fs_source = document.getElementById('shader-fs').innerHTML;//compile shadersvertexShader = makeShader(vs_source, gl.VERTEX_SHADER);fragmentShader = makeShader(fs_source, gl.FRAGMENT_SHADER);//create programglProgram = gl.createProgram();//attach and link shaders to the programgl.attachShader(glProgram, vertexShader);gl.attachShader(glProgram, fragmentShader);gl.linkProgram(glProgram);if (!gl.getProgramParameter(glProgram, gl.LINK_STATUS)) {console.error("Unable to initialize the shader program.");}//use programgl.useProgram(glProgram);}function makeShader(src, type) {//compile the vertex shadervar shader = gl.createShader(type);gl.shaderSource(shader, src);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {console.error("Error compiling shader: " + gl.getShaderInfoLog(shader));}return shader;}function toRadian(angle) {return angle * Math.PI / 180;}function getAllUniforms() {glProgram.pMatrixUniform = gl.getUniformLocation(glProgram, 'uPMatrix');glProgram.mvMatrixUniform = gl.getUniformLocation(glProgram, 'uMVMatrix');}function setAllUniforms() {gl.uniformMatrix4fv(glProgram.pMatrixUniform, false, pMatrix);gl.uniformMatrix4fv(glProgram.mvMatrixUniform, false, mvMatrix);}function updateProjectionMatrix() {var near = 10;var far = 400;var widthHeightRatio = canvas.width / canvas.height;var fovy = 40;// mat4.ortho(pMatrix, -canvas.width / 2, canvas.width / 2, canvas.height / 2, -canvas.height / 2, near, far);mat4.perspective(pMatrix, toRadian(fovy), widthHeightRatio, near, far);}var rotate = 0;function updateModelViewMatrix() {mat4.identity(mvMatrix, mvMatrix);mat4.translate(mvMatrix, mvMatrix, [0, 0, -200]);mat4.rotate(mvMatrix, mvMatrix, toRadian(rotate++), [0, 1, 0]);}var position_buffer_mesh1 = null;var color_buffer_mesh1 = null;var index_buffer_mesh1 = null;function setupBuffer1() {//  1.复制索引数组到一个顶点缓冲(VAO)中,等待使用var position = [-50, -30, 0,-5, -30, 0,-5, 30, 0,-50, 30, 0];position_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);var color = [1, 0, 0,0, 1, 0,0, 0, 1,1, 0, 0];color_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);// 2.复制索引数组到一个索引缓冲(EBO)中,等待使用var index = [0, 1, 2,0, 2, 3];index_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);// 3.开启顶点属性let aVertexPosition = gl.getAttribLocation(glProgram, 'position');gl.enableVertexAttribArray(aVertexPosition);let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexColor);}var position_buffer_mesh2 = null;var color_buffer_mesh2 = null;var index_buffer_mesh2 = null;function setupBuffer2() {var position = [5, -30, 0,50, -30, 0,50, 30, 0];position_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh2);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);var color = [1, 0, 0,0, 1, 0,0, 0, 1,];color_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh2);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);var index = [0, 1, 2];index_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh2);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);let aVertexPosition = gl.getAttribLocation(glProgram, 'position');//按理来说这里同一个programgl.enableVertexAttribArray(aVertexPosition);let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexColor);}function draw(n) {gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_SHORT, 0);}function animate() {requestAnimationFrame(animate);// update uniformupdateModelViewMatrix();setAllUniforms();// 这个案例只使用了一个materiallet aVertexPosition = gl.getAttribLocation(glProgram, 'position');let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.clear(gl.COLOR_BUFFER_BIT);// draw first onegl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);draw(6);// draw second onegl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh2);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh2);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh2);draw(3);}window.onload = function () {getGLContext();initShaders();getAllUniforms();updateProjectionMatrix();setupBuffer1();setupBuffer2();animate();}</script>
</body></html>

使用VAO渲染案例(参考可以看下)

<!doctype html>
<html><head><meta charset="utf-8" /><title>Basic Draw Rectangle</title><script id="shader-vs" type="x-shader/x-vertex">// precision lowp float;attribute vec3 position;attribute vec3 color;uniform mat4 uMVMatrix;uniform mat4 uPMatrix;varying vec4 vcolor;void main(void){vcolor = vec4(color,1.0);gl_Position = uPMatrix * uMVMatrix * vec4(position, 1.0);}</script><script id="shader-fs" type="x-shader/x-fragment">precision lowp float;varying vec4 vcolor;void main(void) {gl_FragColor = vcolor;}</script>
</head><body><canvas id="canvas" width="400" height="400"></canvas><script type="text/javascript" src="../library/gl-matrix.js"></script><script>var gl;var canvas = document.getElementById('canvas');var pMatrix = mat4.create();var mvMatrix = mat4.create();var glProgram = null;var ext = null;function getGLContext() {var glContextNames = ['webgl', 'experimental-webgl'];for (var i = 0; i < glContextNames.length; i++) {try {gl = canvas.getContext(glContextNames[i]);} catch (e) { }if (gl) {gl.clearColor(74 / 255, 115 / 255, 94 / 255, 1.0);gl.clear(gl.COLOR_BUFFER_BIT);gl.viewport(0, 0, canvas.width, canvas.height);ext = gl.getExtension("OES_vertex_array_object");break;}}}function initShaders() {//get shader sourcevar vs_source = document.getElementById('shader-vs').innerHTML,fs_source = document.getElementById('shader-fs').innerHTML;//compile shadersvertexShader = makeShader(vs_source, gl.VERTEX_SHADER);fragmentShader = makeShader(fs_source, gl.FRAGMENT_SHADER);//create programglProgram = gl.createProgram();//attach and link shaders to the programgl.attachShader(glProgram, vertexShader);gl.attachShader(glProgram, fragmentShader);gl.linkProgram(glProgram);if (!gl.getProgramParameter(glProgram, gl.LINK_STATUS)) {alert("Unable to initialize the shader program.");}//use programgl.useProgram(glProgram);}function makeShader(src, type) {//compile the vertex shadervar shader = gl.createShader(type);gl.shaderSource(shader, src);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {console.error("Error compiling shader: " + gl.getShaderInfoLog(shader));}return shader;}function toRadian(angle) {return angle * Math.PI / 180;}function getAllUniforms() {glProgram.pMatrixUniform = gl.getUniformLocation(glProgram, 'uPMatrix');glProgram.mvMatrixUniform = gl.getUniformLocation(glProgram, 'uMVMatrix');}function setAllUniforms() {gl.uniformMatrix4fv(glProgram.pMatrixUniform, false, pMatrix);gl.uniformMatrix4fv(glProgram.mvMatrixUniform, false, mvMatrix);}function updateProjectionMatrix() {var near = 10;var far = 400;var widthHeightRatio = canvas.width / canvas.height;var fovy = 40;// mat4.ortho(pMatrix, -canvas.width / 2, canvas.width / 2, canvas.height / 2, -canvas.height / 2, near, far);mat4.perspective(pMatrix, toRadian(fovy), widthHeightRatio, near, far);}var rotate = 0;function updateModelViewMatrix() {mat4.identity(mvMatrix, mvMatrix);mat4.translate(mvMatrix, mvMatrix, [0, 0, -200]);mat4.rotate(mvMatrix, mvMatrix, toRadian(rotate++), [0, 1, 0]);}var position_buffer_mesh1 = null;var color_buffer_mesh1 = null;var index_buffer_mesh1 = null;var vao1 = null;function setupBuffer1() {// 1.创建VBO,并bind顶点属性数据var position = [-50, -30, 0,-5, -30, 0,-5, 30, 0,-50, 30, 0];var color = [1, 0, 0,0, 1, 0,0, 0, 1,1, 0, 0];position_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);color_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);// 2.复创建EBOvar index = [0, 1, 2,0, 2, 3];index_buffer_mesh1 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);// 3.创建和绑定VAO对象vao1 = ext.createVertexArrayOES();ext.bindVertexArrayOES(vao1);let aVertexPosition = gl.getAttribLocation(glProgram, 'position');let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexPosition);gl.enableVertexAttribArray(aVertexColor);gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh1);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh1);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh1);ext.bindVertexArrayOES(null);}var position_buffer_mesh2 = null;var color_buffer_mesh2 = null;var index_buffer_mesh2 = null;var vao2 = null;function setupBuffer2() {vao2 = ext.createVertexArrayOES();ext.bindVertexArrayOES(vao2);var position = [5, -30, 0,50, -30, 0,50, 30, 0,5, 30, 0];position_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, position_buffer_mesh2);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(position), gl.STATIC_DRAW);let aVertexPosition = gl.getAttribLocation(glProgram, 'position');gl.enableVertexAttribArray(aVertexPosition);gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0);var color = [1, 0, 0,0, 1, 0,0, 0, 1,1, 0, 0];color_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer_mesh2);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(color), gl.STATIC_DRAW);let aVertexColor = gl.getAttribLocation(glProgram, 'color');gl.enableVertexAttribArray(aVertexColor);gl.vertexAttribPointer(aVertexColor, 3, gl.FLOAT, false, 0, 0);var index = [0, 1, 2,0, 2, 3];index_buffer_mesh2 = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer_mesh2);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index), gl.STATIC_DRAW);ext.bindVertexArrayOES(null);}function draw(n) {gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_SHORT, 0);}function animate() {requestAnimationFrame(animate);// update uniformupdateModelViewMatrix();setAllUniforms();gl.clear(gl.COLOR_BUFFER_BIT);// draw first oneext.bindVertexArrayOES(vao1);draw(6);// // draw second oneext.bindVertexArrayOES(vao2);draw(6);}window.onload = function () {getGLContext();initShaders();getAllUniforms();updateProjectionMatrix();setupBuffer1();setupBuffer2();animate();}</script>
</body></html>

【WEBGL】VAO和VBO理解相关推荐

  1. OpenGL - 如何理解 VAO 与 VBO 之间的关系

    系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGL LearnOpenGL 笔记 - 入门 02 创建窗口 LearnOpenGL 笔记 - 入门 03 你好,窗口 LearnO ...

  2. 【OpenGL】理解VAO、VBO、EBO和 shader中vertex、fragment交互。

    1:首先了解GPU和渲染管道工作原理. 2:解释VAO.VBO.EBO 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 元 ...

  3. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  4. openGL关于VAO和VBO和EBO的区分和理解

    1.VBO VBO为顶点缓冲对象,是显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标,顶点法向量,顶点颜色数据等.在渲染时,可以直接从VBO中取出顶点的各类属性数据. 所以 ...

  5. 关于VAO,VBO和EBO的理解-OpenGL学习笔记

    本文章首发于我的个人博客,希望大家多多支持! Hi! This is Showhoop Studio! 如果要从代码层面去理解渲染管线的工作,学习使用OpenGL编程可以说是一个不错的选择.这里我将记 ...

  6. webgl——VAO

    上次说到了对VAO.VBO的理解,明白了使用VAO相比传统模式在IO方面对加载性能的提升,今天我对其在WebGL上进行了实现. 在WebGL中由于很多API与OpenGLES大为不同(一般常用的API ...

  7. 【Opengl】 VAO与VBO的关系

    转载 这里 目录 一.VBO的作用 二.VAO的作用 三.一个VAO和多个VBO 注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器.至于什么是顶点和顶点着色器,这里就不多说了,不 ...

  8. QT OpenGL(一 VAO、VBO、EBO使用)

    1.什么是OpenGL? Open Graphics Library,它是一个由Khronos组织制定并维护的规范 OpenGL核心是一个C库,同时也支持多种语言的派生 核心模式 也叫可编程管线,提供 ...

  9. VAO 与 VBO 的前世今生

    VAO 与 VBO 的前世今生 在现代OpenGL(3.0+)的体系里,VAO和VBO已经是个很基本的概念了,是学习GL必须要理解的一个点.昨天,组内的同学在学习Learn OpenGL的时候,就被这 ...

最新文章

  1. C++_泛型编程与标准库(六)
  2. Android startActivityForResult
  3. php对长文章进行分页处理
  4. foreach ($cc as $key = $item);$item加与不加的区别
  5. 【Linux基础】kiickstart无人值守安装
  6. android MotionEvent中getX()和getRawX()的区别
  7. redis的分布式解决方式--codis
  8. 数据科学之:消费者资产分析
  9. python的调用函数_Python函数调用
  10. signature=0727ee8cc38ba70036807ebbc0b018d6,NMSSM+
  11. Linux01-BASH脚本编程之信号捕捉及任务计划53
  12. 人民币兑换、换硬币 C语言
  13. mp3文件怎么压缩大小
  14. 汽车自动驾驶是人工智能吗,自动驾驶是人工智能
  15. 魔方cfop公式软件_魔方与群论(一)(不要被标题吓到,高中生就可以看)
  16. php接入外汇购物,兑换难!这些外币最好别带回国
  17. 带T和Z的时间字符串转Long型
  18. python万年历节气_用Python精确计算100年内二十四节气日期
  19. 网管软件的几种主动监测方式
  20. 毕业设计一周一记04

热门文章

  1. html调整disabled按钮颜色,Input Color disabled 属性的用法_HTML对象
  2. linux编译gcc多久时间,Linux gcc编译参数说明
  3. Springboot Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException
  4. 毒霸主页篡改浏览器主页
  5. 音量键唤醒屏幕方法技术
  6. http状态码304
  7. 数据分析师刚入职第一月需要注意什么?
  8. 非统招大专转行软件测试,连获4个offer,转正薪资11K
  9. ROS控制多台机器人实现多机协同
  10. EtherCAT总线伺服电机/一体化伺服电机报警信息在哪个参数里面查看