一、简介
Adreno GPU SDK提供了非常完善的框架,我们可以通过制作出很多有趣的东西,在Sample路径下的实例中,也提供了大量的实例来向大家展示其强大的功能。那么在接下来,我将带领大家对这些例程进行分析和学习。
二、OpenGL ES例程分析
进入Sample下的OpenGLES文件夹,大家可以看到大量的实例:
我们选择Skining例程吧,进入后会看到Scene.cpp和Scene.h两个文件,我们理所当然会先看一下Scene.h,看下它里面都有什么。
此处定义了一个Shader结构体:
struct SHADER_CONSTANTS
{
INT32 m_slotWorldMatrix;
INT32 m_slotViewMatrix;
INT32 m_slotProjMatrix;
INT32 m_slotMaterialDiffuse;
INT32 m_slotMaterialSpecular;
INT32 m_slotMaterialAmbient;
};
另外还有一个包含了Adreno SDK的框架函数的类,它继承自CFrmApplication。详细对SDK框架有过了解的朋友都知道这几个函数:
virtual BOOL Initialize();
virtual BOOL Resize();
virtual VOID Update();
virtual VOID Render();
virtual VOID Destroy();
CSample( const CHAR* strName );
我们这里就直接跳过,不熟悉的可以自行百度。接下来进入Scene.cpp中,它肯定会实现.h文件里面定义到的东西,这是毋庸置疑的。首先肯定是头文件这块了,除了包含有框架内定义的东西和Scene.h外,还有与OpenGL ES相关的几个头文件在内:
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
这块的编译就稍显复杂了,其实这几个头文件也是框架里面的,但为什么我要单独拎出来,就要在这里为大家解释下了。进入当目录下的Android/jni,这里有Android.mk和一个Application.mk文件,这是个可以由NDK进行编译的东西。接下来带大家看下Android.mk文件:
…
LOCAL_PATH := $(call my-dir)
SRC_PATH := …/…
INC_PATH := …/…/…/…/…/Inc
FRM_PATH := $(SRC_PATH)/…/…/Framework
FRM_OPENGL_PATH := $(FRM_PATH)/OpenGLES
FRM_ANDROID_PATH := $(FRM_PATH)/Android
include $(CLEAR_VARS)
LOCAL_MODULE := Skinning
LOCAL_SRC_FILES := $(SRC_PATH)/Scene.cpp
$(FRM_OPENGL_PATH)/FrmFontGLES.cpp
$(FRM_OPENGL_PATH)/FrmMesh.cpp
$(FRM_OPENGL_PATH)/FrmPackedResourceGLES.cpp
$(FRM_OPENGL_PATH)/FrmResourceGLES.cpp
$(FRM_OPENGL_PATH)/FrmShader.cpp
$(FRM_OPENGL_PATH)/FrmUserInterfaceGLES.cpp
$(FRM_OPENGL_PATH)/FrmUtilsGLES.cpp
$(FRM_PATH)/FrmApplication.cpp
$(FRM_PATH)/FrmFont.cpp
$(FRM_PATH)/FrmInput.cpp
$(FRM_PATH)/FrmPackedResource.cpp
$(FRM_PATH)/FrmUserInterface.cpp
$(FRM_PATH)/FrmUtils.cpp
$(FRM_ANDROID_PATH)/FrmApplication_Platform.cpp
$(FRM_ANDROID_PATH)/FrmFile_Platform.cpp
$(FRM_ANDROID_PATH)/FrmStdlib_Platform.cpp
$(FRM_ANDROID_PATH)/FrmUtils_Platform.cpp
$(FRM_ANDROID_PATH)/FrmNoise_Platform.cpp
LOCAL_C_INCLUDES := $(SRC_PATH)
$(FRM_PATH)
$(INC_PATH)
$(FRM_OPENGL_PATH)
$(FRM_ANDROID_PATH)
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
LOCAL_CFLAGS += -Wno-write-strings -Wno-conversion-null
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
这里编译了整个框架中最核心的一些内容,如果我们要自行编写一些.cpp文件的话,只需要:$(SRC_PATH)/ 下加入即可,这里链接了OpenGL ES的v2版本,相信熟悉OpenGL ES的朋友已经发现了,这里使用到的是图形渲染管线而非固定渲染管线,因此我们需要实现顶点着色器和片段着色器等这一大堆复杂的东西。
不过大家仔细研究下Scene.cpp,会发现这里并没有这些复杂的算法相关的东西,这对于我们来说当然是好事情了,毕竟这部分东西是相当复杂的。在整个SDK框架中,它给我们在Bin/Samples/Shaders下提供了大量的Shader,我们要做的仅仅是读懂它就可以了,在使用的时候通过函数加载进程序里面,如这里的:
我们只需要调用这里的顶点着色器和片段着色器,然后就可以获取里面提供的接口变量,并对其进行调整,绘制出想要的效果来了。
三、总结
好了,本篇文章我们就先讲到这里。大家可以先下载SDK自己研究下,在接下来我们将进入框架对此例程进行解读。