ndk中实现opengles画山地图

来源:互联网 发布:linux 多线程详解 编辑:程序博客网 时间:2024/04/30 01:13

android.mk

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := echoLOCAL_CFLAGS    := -WerrorLOCAL_SRC_FILES := \gl_code.cpp\Mountion.cpp\MatrixState.cppLOCAL_LDLIBS    := -llog -lGLESv2include $(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 __cplusplusextern "C" {#endifJNIEXPORT 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

0 0