细谈Open GL里的Program和Shader

Program和Shader对象

Program相当于当前渲染管线所使用的程序,是Shader得容器,可以挂载多个Shader.

Shader相当于一个C模块,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。

Vertex Shader负责将顶点数据进一步处理 ,Fragment Shader将像素数据进一步处理。所以Vertex Shader中的代码针对每个点都会调用一次,Fragment Shader中的代码针对每个像素都会调用一次。

 

创建Shader的流程如下:

1、调用glCreateShader()创建一个Shader对象;

2、调用glShaderSource()创建加载Shader脚本源码;

3、调用glCompileShader()编译Shader脚本;

 

创建Program的流程如下:

1、调用glCreateProgram()创建一个Program对象;

2、调用glAttachShader()将创建好的Shader进行挂载;

3、调用glLinkProgram()执行链接操作;

4、最后在需要使用Shader时,调用glUseProgram()应用当前Shader;

 

着色(Shader)语言:

着色语言是一种类C的编程语言,但不支持double,byte,short,long,并且取消了C中的union,enum,unsigned以及位运算等特性。着色语言中有许多内建的原生数据类型以及构建数据类型,如:浮点型(float)、布尔型(bool)、整型(int)、矩阵型(matrix)以及向量型(vec2、vec3等)等。总体来说,这些数据类型可以分为标量、向量、矩阵、采样器、结构体以及数组等。

支持的数据类型如下:

float bool int   基本数据类型

Vec2      包含了2个浮点数的向量

Vec3      包含了3个浮点数的向量

Vec4      包含了4个浮点数的向量

Ivec2      包含了2个整数的向量

ivec3      包含了3个整数的向量

ivec4      包含了4个整数的向量

bvec2               包含了2个布尔数的向量

bvec3               包含了3个布尔数的向量

bvec4               包含了4个布尔数的向量

mat2                2*2维矩阵

mat3                3*3维矩阵

mat4                4*4维矩阵

sampler1D           1D纹理采样器

sampler2D           2D纹理采样器

sampler3D           3D纹理采样器

 

Vertex Shader的语法

变量类型 + 变量数据类型 + 变量名

变量类型有三种:

1、attribute: 就是顶点数据(Vertex Data)包含的属性,位置,颜色或其他,顶点数据包含多少属性,这里就可以写多少,通过glEnableVertexAttribArray和glVertexAttribPointer激活和传值。

2、varying: 传递给Fragment Shader的变量,Fragment Shader是无法直接接受顶点数据的,因为它处理的是像素级别的数据。传递给Fragment Shader的值是根据像素位置差值计算之后的值。

3、uniform: 可以理解为全局变量,所有顶点处理程序共享这个变量。

变量数据类型有(见上面数据类型介绍)

 

 

顶点着色器介绍

1.1 顶点着色器示例代码

uniform mat4 uMVPMatrix; //应用程序传入顶点着色器的总变换矩阵

Attribute vec4 aPosition;     //应用程序传入顶点着色器的顶点位置

Attribute vec2 aTextureCoord;//应用程序传入顶点着色器的顶点纹理坐标

Attribute vec4 aColor; //应用程序传入顶点着色器的顶点颜色变量

varying vec4 vColor; //用于传递给片元着色器的顶点颜色数据

Varying vec2 vTextureCoord; //用于传递给片元着色器的顶点纹理数据

void main()

{

gl_Position = uMVPMatrix * aPosition;  //根据总变换矩阵计算此次绘制此顶点位置

vColor = aColor; //将顶点颜色数据传入片元着色

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Android 应用程序,使用 OpenGL ES 2.0 在屏幕上绘制一个彩色三角形: ```java import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; public class MyGLRenderer implements GLSurfaceView.Renderer { private Triangle mTriangle; private Square mSquare; private final float[] mMVPMatrix = new float[16]; private final float[] mProjectionMatrix = new float[16]; private final float[] mViewMatrix = new float[16]; public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); mTriangle = new Triangle(); mSquare = new Square(); } public void onDrawFrame(GL10 unused) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // Set the camera position (View matrix) Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); // Calculate the projection and view transformation Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); // Draw shape mTriangle.draw(mMVPMatrix); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; // this projection matrix is applied to object coordinates // in the onDrawFrame() method Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7); } public static int loadShader(int type, String shaderCode){ // create a vertex shader type (GLES20.GL_VERTEX_SHADER) // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER) int shader = GLES20.glCreateShader(type); // add the source code to the shader and compile it GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; } public static void checkGlError(String glOperation) { int error; while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { Log.e("MyGLRenderer", glOperation + ": glError " + error); throw new RuntimeException(glOperation + ": glError " + error); } } } ``` 其中,`Triangle` 和 `Square` 是继承自 `Shape` 的类,用于绘制图形。这省略了这两个类的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值