android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := echo
LOCAL_CFLAGS := -Werror
LOCAL_SRC_FILES := \
gl_code.cpp\
Mountion.cpp\
MatrixState.cpp
LOCAL_LDLIBS := -llog -lGLESv2
include $(BUILD_SHARED_LIBRARY)
核心绘制类
#include <jni.h>
#include <android/log.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Mountion.h"
#include "Matrix.h"
#include "MatrixState.h"
Mountion *m;
int mountionId;
int rockId;
bool setupGraphics(JNIEnv * env,jobject obj,int w, int h) {
jclass cl = env->FindClass("com/bn/sample14_2/GL2JNIView");
jmethodID id = env->GetStaticMethodID(cl,"initTextureRepeat","(Landroid/opengl/GLSurfaceView;Ljava/lang/String;)I");
jstring name = env->NewStringUTF("grass.png");
mountionId = env->CallStaticIntMethod(cl,id,obj,name);
name = env->NewStringUTF("rock.png");
rockId = env->CallStaticIntMethod(cl,id,obj,name);
glViewport(0, 0, w, h);
float ratio = (float) w/h;
MatrixState::setProjectFrustum(-ratio, ratio, -1, 1, 1, 1000);
MatrixState::setCamera(0, 5, 20, 0, 1, 0, 0, 1, 0);
MatrixState::setInitStack();
glEnable(GL_DEPTH_TEST);
m = new Mountion();
return true;
}
void renderFrame() {
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 1);
MatrixState::setInitStack();
m->drawSelf(mountionId,rockId);
}
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_bn_sample14_12_GL2JNILib_init(JNIEnv * env, jclass jc, jobject obj, jint width, jint height)
{
setupGraphics(env,obj,width, height);
}
JNIEXPORT void JNICALL Java_com_bn_sample14_12_GL2JNILib_step(JNIEnv * env, jclass jc)
{
renderFrame();
}
JNIEXPORT void JNICALL Java_com_bn_sample14_12_GL2JNILib_setCamera
(JNIEnv *, jclass, jfloat cx, jfloat cy, jfloat cz, jfloat tx, jfloat ty, jfloat tz, jfloat upx, jfloat upy, jfloat upz)
{
MatrixState::setCamera(cx,5,cz,tx,1,tz,0,1,0);
}
#ifdef __cplusplus
}
#endif
顶点着色和片元着色
const char* SimpleVertexShader = STRINGIFY(
uniform mat4 uMVPMatrix; //总变换矩阵
attribute vec3 aPosition; //顶点位置
attribute vec2 aTexCoor; //顶点纹理坐标
varying vec2 vTextureCoord; //用于传递给片元着色器的纹理坐标
varying float currY; //用于传递给片元着色器的Y坐标
void main(){
gl_Position = uMVPMatrix * vec4(aPosition,1); //根据总变换矩阵计算此次绘制此顶点的位置
vTextureCoord = aTexCoor; //将接收的纹理坐标传递给片元着色器
currY=aPosition.y; //将顶点的Y坐标传递给片元着色器
}
);
const char* SimpleFragmentShader = STRINGIFY(
precision mediump float; //给出默认的浮点精度
varying vec2 vTextureCoord; //接收从顶点着色器过来的纹理坐标
varying float currY; //接收从顶点着色器过来的Y坐标
uniform sampler2D sTextureGrass; //纹理内容数据(草皮)
uniform sampler2D sTextureRock; //纹理内容数据(岩石)
uniform float landStartY; //过程纹理起始Y坐标
uniform float landYSpan; //过程纹理跨度
void main(){
vec4 gColor=texture2D(sTextureGrass, vTextureCoord); //从草皮纹理中采样出颜色
vec4 rColor=texture2D(sTextureRock, vTextureCoord); //从岩石纹理中采样出颜色
vec4 finalColor; //最终颜色
if(currY<landStartY){
finalColor=gColor; //当片元Y坐标小于过程纹理起始Y坐标时采用草皮纹理
}else if(currY>landStartY+landYSpan){
finalColor=rColor; //当片元Y坐标大于过程纹理起始Y坐标加跨度时采用岩石纹理
}else{
float currYRatio=(currY-landStartY)/landYSpan; //计算岩石纹理所占的百分比
finalColor= currYRatio*rColor+(1.0- currYRatio)*gColor;//将岩石、草皮纹理颜色按比例混合
}
gl_FragColor = finalColor; //给此片元最终颜色值
}
);
demo地址:http://download.csdn.net/detail/hb707934728/9734649