ndk中实现opengles画山地图

本文详细介绍了如何在Android的NDK环境中使用OpenGLES进行地图渲染,特别是针对绘制山脉地形的技巧和步骤进行了深入探讨。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值