今天早上的道路,很顺畅嘛~希望天天能达到今天的程度就好了
通过昨天的学习,发现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