VBO与VAO

    //初始化顶点坐标与着色数据的方法
    public void initVertexData(float[] vertices,float[] normals,float texCoors[])
    {
    	 //顶点坐标数据的初始化================begin============================
    	 vCount=vertices.length/3;   
		
        //创建顶点坐标数据缓冲
        //vertices.length*4是因为一个整数四个字节
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
        vbb.order(ByteOrder.nativeOrder());//设置字节顺序
        mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
        mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
        mVertexBuffer.position(0);//设置缓冲区起始位置
        //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
        //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
        //顶点坐标数据的初始化================end============================
        
        //顶点法向量数据的初始化================begin============================  
        ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
        cbb.order(ByteOrder.nativeOrder());//设置字节顺序
        mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
        mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
        mNormalBuffer.position(0);//设置缓冲区起始位置
        //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
        //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
        //顶点着色数据的初始化================end============================
        
        //顶点纹理坐标数据的初始化================begin============================  
        ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
        tbb.order(ByteOrder.nativeOrder());//设置字节顺序
        mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
        mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
        mTexCoorBuffer.position(0);//设置缓冲区起始位置
        //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
        //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
        //顶点纹理坐标数据的初始化================end============================
    }
    
    public void drawSelf(int texId)
    {        
    	  //制定使用某套着色器程序
    	  GLES30.glUseProgram(mProgram);
         //将最终变换矩阵传入着色器程序
         GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0); 
         //将位置、旋转变换矩阵传入着色器程序
         GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);   
         //将光源位置传入着色器程序   
         GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
         //将摄像机位置传入着色器程序   
         GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
         // 将顶点位置数据传入渲染管线
         GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, mVertexBuffer);       
         //将顶点法向量数据传入渲染管线
         GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, mNormalBuffer);   
         //将顶点纹理坐标数据传入渲染管线
         GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, mTexCoorBuffer);
         //启用顶点位置、法向量、纹理坐标数据
         GLES30.glEnableVertexAttribArray(maPositionHandle);  
         GLES30.glEnableVertexAttribArray(maNormalHandle);  
         GLES30.glEnableVertexAttribArray(maTexCoorHandle); 
         //绑定纹理
         GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
         GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);
         //绘制加载的物体
         GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount); 
}
    public void initVertexData(float[] vertices,float[] normals,float texCoors[]){
    	//缓冲id数组
    	int[] buffIds=new int[3];
    	//生成3个缓冲id
    	GLES30.glGenBuffers(3, buffIds, 0);
    	//顶点坐标数据缓冲 id
    	mVertexBufferId=buffIds[0];
    	//顶点法向量数据缓冲id
    	mNormalBufferId=buffIds[1];
    	//顶点纹理坐标数据缓冲id
    	mTexCoorBufferId=buffIds[2];
    	
    	//顶点坐标数据的初始化================begin============================
    	vCount=vertices.length/3;   
      //创建顶点坐标数据缓冲
      //vertices.length*4是因为一个整数四个字节
      ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
      vbb.order(ByteOrder.nativeOrder());//设置字节顺序
      FloatBuffer mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
      mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
      mVertexBuffer.position(0);//设置缓冲区起始位置
      //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer转换,
      //关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题。
      //绑定到顶点坐标数据缓冲 
    	GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
    	//向顶点坐标数据缓冲送入数据
    	GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vertices.length*4, mVertexBuffer, GLES30.GL_STATIC_DRAW);    	
    	//顶点坐标数据的初始化================end============================
        
      //顶点法向量数据的初始化================begin============================  
      ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
      cbb.order(ByteOrder.nativeOrder());//设置字节顺序
      FloatBuffer mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
      mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
      mNormalBuffer.position(0);//设置缓冲区起始位置
      //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer转换,
      //关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
      //绑定到顶点法向量数据缓冲
    	GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
      //向顶点法向量数据缓冲送入数据
    	GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, normals.length*4, mNormalBuffer, GLES30.GL_STATIC_DRAW);  
      //顶点着色数据的初始化================end============================
        
      //顶点纹理坐标数据的初始化================begin============================  
      ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
      tbb.order(ByteOrder.nativeOrder());//设置字节顺序
      FloatBuffer mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
      mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
      mTexCoorBuffer.position(0);//设置缓冲区起始位置
      //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
      //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
      //绑定到顶点纹理坐标数据缓冲
    	GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
    	//向顶点纹理坐标数据缓冲送入数据
    	GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, texCoors.length*4, mTexCoorBuffer, GLES30.GL_STATIC_DRAW);
    	//顶点纹理坐标数据的初始化================end============================
    	//绑定到系统默认缓冲
    	GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
    }

    public void drawSelf(int texId){        
        GLES30.glUseProgram(mProgram);
        //将最终变换矩阵传入渲染管线
        GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0); 
        //将位置、旋转变换矩阵传入渲染管线
        GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);   
        //将光源位置传入渲染管线
        GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
        //将摄像机位置传入渲染管线
        GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
         
        //启用顶点位置、法向量、纹理坐标数据
        GLES30.glEnableVertexAttribArray(maPositionHandle);  
        GLES30.glEnableVertexAttribArray(maNormalHandle);  
        GLES30.glEnableVertexAttribArray(maTexCoorHandle); 

        //绑定到顶点坐标数据缓冲 
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId); 
        //将顶点位置数据送入渲染管线     	 
        GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);  
        //绑定到顶点法向量数据缓冲
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
        //将顶点法向量数据送入渲染管线
        GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);   
        //绑定到顶点纹理坐标数据缓冲
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
        //将顶点纹理坐标数据送入渲染管线
        GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, 0);
        //绑定到系统默认缓冲
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);

        GLES30.glActiveTexture(GLES30.GL_TEXTURE0);//激活纹理
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);//绑定纹理
        GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount); //绘制加载的物体

}
   public void initVertexData(float[] vertices,float[] normals,float texCoors[]){
    	//缓冲id数组
    	int[] buffIds=new int[3];
    	//生成3个缓冲id
    	GLES30.glGenBuffers(3, buffIds, 0);
    	//顶点坐标数据缓冲 id
    	mVertexBufferId=buffIds[0];
    	//顶点法向量数据缓冲id
    	mNormalBufferId=buffIds[1];
    	//顶点纹理坐标数据缓冲id
    	mTexCoorBufferId=buffIds[2];
       //顶点坐标数据的初始化================begin============================
       vCount=vertices.length/3;   
       //创建顶点坐标数据缓冲
       ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
       vbb.order(ByteOrder.nativeOrder());//设置字节顺序
       FloatBuffer mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
       mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
       mVertexBuffer.position(0);//设置缓冲区起始位置
       //绑定到顶点坐标数据缓冲 
    	GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
    	//向顶点坐标数据缓冲送入数据
    	GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vertices.length*4, mVertexBuffer, GLES30.GL_STATIC_DRAW);    	
       //顶点坐标数据的初始化================end============================
       //顶点法向量数据的初始化================begin============================  
       ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
       cbb.order(ByteOrder.nativeOrder());//设置字节顺序
       FloatBuffer mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
       mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
       mNormalBuffer.position(0);//设置缓冲区起始位置
       //绑定到顶点法向量数据缓冲
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
       //向顶点法向量数据缓冲送入数据
       GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, normals.length*4, mNormalBuffer, GLES30.GL_STATIC_DRAW);    	
       //顶点着色数据的初始化================end============================
       //顶点纹理坐标数据的初始化================begin============================  
       ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
       tbb.order(ByteOrder.nativeOrder());//设置字节顺序
       FloatBuffer mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
       mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
       mTexCoorBuffer.position(0);//设置缓冲区起始位置
       //绑定到顶点纹理坐标数据缓冲
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
    	 //向顶点纹理坐标数据缓冲送入数据
    	 GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, texCoors.length*4, mTexCoorBuffer, GLES30.GL_STATIC_DRAW);
    	 //顶点纹理坐标数据的初始化================end============================
    	 GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);    	
    	 initVAO();
    }
    
    public void initVAO(){
       int[] vaoIds=new int[1];
       //生成VAO
       GLES30.glGenVertexArrays(1, vaoIds, 0);
       vaoId=vaoIds[0];
       //绑定VAO
       GLES30.glBindVertexArray(vaoId);
       //启用顶点位置、法向量、纹理坐标数据
       GLES30.glEnableVertexAttribArray(maPositionHandle);  
       GLES30.glEnableVertexAttribArray(maNormalHandle);  
       GLES30.glEnableVertexAttribArray(maTexCoorHandle); 
       //绑定到顶点坐标数据缓冲 
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId); 
       //将顶点位置数据送入渲染管线     	 
       GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);  
       //绑定到顶点法向量数据缓冲
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
       //将顶点法向量数据送入渲染管线
       GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);   
       //绑定到顶点纹理坐标数据缓冲
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
       //将顶点纹理坐标数据送入渲染管线
       GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, 0);
       // 绑定到系统默认缓冲
       GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
       GLES30.glBindVertexArray(0);
    }
   
    public void drawSelf(int texId){        
       GLES30.glUseProgram(mProgram);
       //将最终变换矩阵传入渲染管线
       GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0); 
       //将位置、旋转变换矩阵传入渲染管线
       GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);   
       //将光源位置传入渲染管线
       GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
       //将摄像机位置传入渲染管线 
       GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
       GLES30.glBindVertexArray(vaoId);      
       GLES30.glActiveTexture(GLES30.GL_TEXTURE0);//激活纹理
       GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);         //绑定纹理
       GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount); //绘制加载的物体
       GLES30.glBindVertexArray(0);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值