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