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

今天早上的道路,很顺畅嘛~希望天天能达到今天的程度就好了

通过昨天的学习,发现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语言。接着是创建编程容器。最后运行程序,画图。就这样。

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

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

零基础开发OpenGL ES 2.0学习笔记-Android篇(二)_第1张图片

代码下载地址:20141123.zip

你可能感兴趣的:(OpenGL,ES,学习笔记,opengl,es,android)