您的位置:首页 > 移动开发 > Android开发

零基础开发OpenGL ES 2.0学习笔记-Android篇(二)

2014-11-26 16:44 344 查看
今天早上的道路,很顺畅嘛~希望天天能达到今天的程度就好了


通过昨天的学习,发现OpenGL不是面向对象的编程思想,所以对于我这个JAVA程序员来说,今后使用时,需要注意啊~

今天的目标是:构建一个OpenGL的图形

研究了一天,发现OpenGL ES 2.0使用了一种叫GLSL的一种语言。

-------------------------------------------------------------------------------------------------------------------------------------------------------

OpenGL着色语言(GLSL―OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程型。比如:视图转换、投影转换等。

GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器),有时还会有Geometry Shader(几何着色器)。负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL 中的状态,GLSL内置变量进行传递。GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。

--引自百度百科

-------------------------------------------------------------------------------------------------------------------------------------------------------

能看懂上面这段话的,说明你已经会GLSL了,看不懂的人应该和我一样,都是不会GLSL的人。

上面这段话中,我认为最重要的两个东西:

  Vertex Shader(顶点着色器)

  Fragment Shader(片元着色器)

由于目前对这两个着色器理解的也不是非常深入,今天在这就不做说明了。

目前理解是一个管位置,一个管效果。以后真正理解的时候再补充说明一下。

下面是在昨天基础上变更的代码

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 创建顶点着色器
int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
String vertexShaderSource =
"attribute vec4 vPosition;    \n"
+ "void main()                  \n"
+ "{                            \n"
+ "   gl_Position = vPosition;  \n"
+ "}                            \n";

GLES20.glShaderSource(vertexShader, vertexShaderSource);
GLES20.glCompileShader(vertexShader);

// 创建片元着色器
int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
String fragmentShaderSource =
"precision mediump float;    \n"
+ "void main()                  \n"
+ "{                            \n"
+ "   gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );    \n"
+ "}                            \n";
GLES20.glShaderSource(fragmentShader, fragmentShaderSource);
GLES20.glCompileShader(fragmentShader);

// 创建程序容器并连接
int programObject = GLES20.glCreateProgram();
GLES20.glAttachShader(programObject, vertexShader);
GLES20.glAttachShader(programObject, fragmentShader);
GLES20.glBindAttribLocation(programObject, 0, "vPosition");
GLES20.glLinkProgram(programObject);

// 释放着色器
GLES20.glDeleteShader(vertexShader);
GLES20.glDeleteShader(fragmentShader);

// 运行程序
GLES20.glViewport(0, 0, width, height);
GLES20.glUseProgram(programObject);

// 释放程序
GLES20.glDeleteProgram(programObject);

// 设置顶点坐标
Buffer ptr = bufferUtil(new float[]{
0.0f,  0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
});

// 将顶点坐标传递到顶点着色器源码的vPosition变量中
int mPositionHandle = GLES20.glGetAttribLocation(programObject, "vPosition");
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, ptr);
GLES20.glEnableVertexAttribArray(mPositionHandle);

// 画图
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
}


简单说明一下,首先是创建那两个没太理解的着色器,05行与17行就是着色器使用的GLSL语言。接着是创建编程容器。最后运行程序,画图。就这样。

为了便于大家理解,我写的这段代码,没有任何逻辑,没有方法之间的调用,连个全局变量都没有,可以说是目前全网最简洁的能生成图形的代码了。

最后附上运行效果,及代码:



代码下载地址:20141123.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: