美文网首页openGL ES
OpenGLES入门(三)与着色器交互

OpenGLES入门(三)与着色器交互

作者: 武小寺 | 来源:发表于2016-06-12 16:08 被阅读2576次

1. 获取着色器程序内成员变量的id,也可以理解为句柄、指针。

    glGetAttribLocation方法:获取着色器程序中,指定为attribute类型变量的id。

    glGetUniformLocation方法:获取着色器程序中,指定为uniform类型变量的id。

    如:

    // 获取指向着色器中aPosition的index

    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");

    // 获取指向着色器中uMVPMatrix的index

    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

2.传递数据

使用上一节获取的指向着色器相应数据成员的各个id,就能将我们自己定义的顶点数据、颜色数据等等各种数据传递到着色器当中了。

// 使用shader程序
GLES20.glUseProgram(mProgram);
// 将最终变换矩阵传入shader程序
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
// 设置缓冲区起始位置
mRectBuffer.position(0);
// 顶点位置数据传入着色器
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 顶点颜色数据传入着色器中
GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false, 4*4, mColorBuffer);
// 顶点坐标传递到顶点着色器
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 允许使用顶点坐标数组
GLES20.glEnableVertexAttribArray(maPositionHandle);
// 允许使用顶点颜色数组
GLES20.glDisableVertexAttribArray(maColorHandle);
// 允许使用定点纹理数组
GLES20.glEnableVertexAttribArray(maTextureHandle); 
// 绑定纹理
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
// 图形绘制
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);

2.1 glVertexAttribPointer,定义顶点属性数组。

函数原型:
void glVertexAttribPointer (int index, int size, int type, boolean normalized, int stride, Buffer ptr )
参数含义:
  index  指定要修改的顶点着色器中顶点变量id;
  size   指定每个顶点属性的组件数量。必须为1、2、3或者4。如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a));
  type   指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT;
  normalized  指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE);
  stride      指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。如果normalized被设置为GL_TRUE,意味着整数型的值会被映射至区间[-1,1](有符号整数),或者区间[0,1](无符号整数),反之,这些值会被直接转换为浮点值而不进行归一化处理;
  ptr  顶点的缓冲数据。

2.2 启用或者禁用顶点属性数组。 调用glEnableVertexAttribArray和glDisableVertexAttribArray传入参数index。如果启用,那么当glDrawArrays或者glDrawElements被调用时,顶点属性数组会被使用。

2.3 glActiveTexture, 选择活动纹理单元。

函数原型:
void glActiveTexture (int texture)
参数含义:
texture指定哪一个纹理单元被置为活动状态。texture必须是GL_TEXTUREi之一,其中0 <= i < GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,初始值为GL_TEXTURE0。
glActiveTexture()确定了后续的纹理状态改变影响哪个纹理,纹理单元的数量是依据该纹理单元所被支持的具体实现。

相关文章

  • OpenGLES入门(三)与着色器交互

    1. 获取着色器程序内成员变量的id,也可以理解为句柄、指针。 2.传递数据 使用上一节获取的指向着色器相应数据...

  • 特效中的着色器代码详解

    前言 图像和视频渲染离不开OpenGLES,在可编程的OpenGLES渲染管线中,顶点着色器和片段着色器使得Ope...

  • OpenGL学习历程三:基于iOS的OpenGL ES

    iOS OpenGLES入门教程OpenGLES文集

  • 片段着色器

    OpenGLES可编程管线流程: 一、固定功能片段着色器在OpenGLES 1.1中(固定功能桌面OpenGL),...

  • 二、OpenGL学习链接

    一、简书 [作者:落影loyinglin] OpenGLES入门教程: OpenGLES入门教程1-Tutor...

  • iOS开发-OpenGLES进阶教程2

    教程 OpenGLES入门教程1-Tutorial01-GLKit OpenGLES入门教程2-Tutorial0...

  • 着色器语言介绍

    // 声明版本 #version 300 es // OpenGLES着色器语言 // 默认精度 precisio...

  • OpenGLES小结

    OpenGLES首先需要创建顶点着色器和片元着色器代码采用gles语言编写顶点着色器的代码如下: OpenGL的所...

  • OpenGLES 入门(一)着色器简介

    与OpenGL ES1.x渲染管线相比,OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES...

  • OpenGLES入门(三)

    上一章中还是对平面图形的绘制和简单的图形变换,在本章中将会开始绘制简单的3D图形,并对图形进行组合变换。 开始学习...

网友评论

    本文标题:OpenGLES入门(三)与着色器交互

    本文链接:https://www.haomeiwen.com/subject/rewedttx.html