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
- ndk中实现opengles画山地图
- android studio的cmake中调用opengles库,实现c++编译opengles
- Android OpenGLES 实现结构
- opengles实现画中画功能
- opengles实现场景控制
- opengles实现方向光
- opengles实现点光源
- opengles实现卡通效果
- opengles实现雾化效果
- Android+NDK+OpenGLES开发环境配置
- OpenglES 中名词缩写
- opengles 2.0 爆炸效果实现
- Iphone:Opengles 画四边形
- Learn OpenGLES:画三角形
- OpenGLES---画一个矩形
- opengles项目架构图
- opengles
- opengles
- 高通sensor坐标轴的转换
- linux tomcat
- 解决MyEclipse吃内存,让MyEclipse飞起来,MyEclipse速度
- Rails在MacOS上搭建Heroku部署环境
- elasthsearch的环境搭建
- ndk中实现opengles画山地图
- 每天一个linux命令(43):killall命令
- Cramer-Rao下界
- 兰州烧饼 南阳oj779
- Android studio 两个项目相互依赖
- MyEclipse过期处理方法
- springmvc与content-type
- 蒙特卡罗方法入门
- Flask项目集成富文本编辑器UEditor 基于蓝图模式下