您的位置:首页 > 运维架构

Opengl ES 1.x NDK实例开发之二:颜色的使用

2015-08-25 13:26 405 查看
转自:http://blog.csdn.net/mnorst/article/details/39580949

【实例讲解】



本章在第一章的基础上讲解颜色的使用。

本例中绘制了一个三角形和一个正方形,三角形用的是光滑着色,正方形用的是平面着色。使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。

[单一颜色渲染]

[cpp] view
plaincopy





glColor4f(1.0f, 0.0f, 0.0f, 1.0f);

[顶点渲染混合]

[cpp] view
plaincopy





glEnableClientState(GL_COLOR_ARRAY); // 启用颜色数组

glColorPointer(4, GL_FLOAT, 0, gColors); // 指定颜色数组

glDisableClientState(GL_COLOR_ARRAY); // 关闭颜色数组

需注意的是,如果调用了glEnableClientState(GL_COLOR_ARRAY),则在代码中就要调用glColorPointer(4, GL_FLOAT, 0, gColors)来指定颜色数组,否则在glDrawArrays(GL_TRIANGLES, 0,
3)会因找不到颜色数组而报错

【实例源码】

[GLJNIActivity.java]

[java] view
plaincopy





/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*

* author: mnorst@foxmail.com

*/



package com.android.gljni;



import com.android.gljni.GLJNIView;



import android.app.Activity;

import android.os.Bundle;



public class GLJNIActivity extends Activity {

GLJNIView mView;



@Override

protected void onCreate(Bundle icicle) {

super.onCreate(icicle);

mView = new GLJNIView(getApplication());

setContentView(mView);

}



@Override

protected void onPause() {

super.onPause();

mView.onPause();

}



@Override

protected void onResume() {

super.onResume();

mView.onResume();

}

}

[GLJNIView.java]

[java] view
plaincopy





/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*

* author: mnorst@foxmail.com

*/



package com.android.gljni;



import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;



import com.android.gljni.GLJNILib;



import android.content.Context;

import android.opengl.GLSurfaceView;



/**

* A simple GLSurfaceView sub-class that demonstrate how to perform

* OpenGL ES 1.x rendering into a GL Surface.

*/

public class GLJNIView extends GLSurfaceView {



private static final String LOG_TAG = GLJNIView.class.getSimpleName();



private Renderer renderer;



public GLJNIView(Context context) {

super(context);



// setEGLConfigChooser会对fps产生影响

setEGLConfigChooser(8, 8, 8, 8, 16, 0);



renderer = new Renderer(context);

setRenderer(renderer);

}



private static class Renderer implements GLSurfaceView.Renderer {



public Renderer(Context ctx) {



}



public void onDrawFrame(GL10 gl) {

GLJNILib.step();

}



public void onSurfaceChanged(GL10 gl, int width, int height) {

GLJNILib.resize(width, height);

}



public void onSurfaceCreated(GL10 gl, EGLConfig config) {

GLJNILib.init();

}

}



}

[GLJNILib.java]

[java] view
plaincopy





/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*

* author: mnorst@foxmail.com

*/



package com.android.gljni;



//Wrapper for native library

public class GLJNILib {



static {

System.loadLibrary("gljni");

}



/**

* @param width the current view width

* @param height the current view height

*/

public static native void resize(int width, int height);



public static native void step();



public static native void init();

}

[gl_code.cpp]

[cpp] view
plaincopy





/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*

* author: mnorst@foxmail.com

* created: 2014/09/26

* purpose: 颜色的使用

*/



// OpenGL ES 1.x code



#include <jni.h>

#include <android/log.h>



#include <GLES/gl.h>

#include <GLES/glext.h>



#include <stdio.h>

#include <stdlib.h>

#include <math.h>



/************************************************************************/

/* 定义 */

/************************************************************************/



#define LOG_TAG "libgljni"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)



// 定义π

const GLfloat PI = 3.1415f;



// 顶点数组

const GLfloat gVertices[] = {

0.0f, 1.0f, 0.0f, // 上

-1.0f,-1.0f, 0.0f, // 左下

1.0f,-1.0f, 0.0f, // 右下

};



const GLfloat gVerticesSquare[] = {

-1.0f, -1.0f, 0.0f, // 左下

1.0f, -1.0f, 0.0f, // 右下

-1.0f, 1.0f, 0.0f, // 左上

1.0f, 1.0f, 0.0f // 右上

};



// 颜色数组

const GLfloat gColors[] = {

1.0f,0.0f,0.0f, 1.0f,

0.0f,1.0f,0.0f, 1.0f,

0.0f,0.0f,1.0f, 1.0f,

};



/************************************************************************/

/* C++代码 */

/************************************************************************/



static void printGLString(const char *name, GLenum s) {

const char *v = (const char *) glGetString(s);

LOGI("GL %s = %s\n", name, v);

}



static void checkGlError(const char* op) {

for (GLint error = glGetError(); error; error

= glGetError()) {

LOGI("after %s() glError (0x%x)\n", op, error);

}

}



bool init() {

printGLString("Version", GL_VERSION);

printGLString("Vendor", GL_VENDOR);

printGLString("Renderer", GL_RENDERER);

printGLString("Extensions", GL_EXTENSIONS);



// 启用阴影平滑

glShadeModel(GL_SMOOTH);



// 黑色背景

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);



// 设置深度缓存

glClearDepthf(1.0f);



// 启用深度测试

glEnable(GL_DEPTH_TEST);



// 所作深度测试的类型

glDepthFunc(GL_LEQUAL);



// 对透视进行修正

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);



return true;

}



static void _gluPerspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)

{

GLfloat top = zNear * ((GLfloat) tan(fovy * PI / 360.0));

GLfloat bottom = -top;

GLfloat left = bottom * aspect;

GLfloat right = top * aspect;

glFrustumf(left, right, bottom, top, zNear, zFar);

}



void resize(int width, int height)

{

// 防止被零除

if (height==0)

{

height=1;

}



// 重置当前的视口

glViewport(0, 0, width, height);

// 选择投影矩阵

glMatrixMode(GL_PROJECTION);

// 重置投影矩阵

glLoadIdentity();



GLfloat ratio = (GLfloat)width/(GLfloat)height;



// 设置视口的大小

_gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);



// 选择模型观察矩阵

glMatrixMode(GL_MODELVIEW);



// 重置模型观察矩阵

glLoadIdentity();

}



void renderFrame() {

// 清除屏幕及深度缓存

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// 设置背景颜色为黑色

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

// 重置当前的模型观察矩阵

glLoadIdentity();



// 启用顶点数组

glEnableClientState(GL_VERTEX_ARRAY);



// 绘制三角形

glTranslatef(0.0f,2.0f,-10.0f); // 设置三角形位置

glEnableClientState(GL_COLOR_ARRAY); // 启用颜色数组

glColorPointer(4, GL_FLOAT, 0, gColors); // 指定颜色数组

glVertexPointer(3, GL_FLOAT, 0, gVertices); // 指定顶点数组

glDrawArrays(GL_TRIANGLES, 0, 3); // 绘制三角形

glDisableClientState(GL_COLOR_ARRAY); // 关闭颜色数组



// 绘制正方形

glTranslatef(0.0f,-4.0f,0.0f); // 设置正方形位置

glColor4f(1.0f, 0.0f, 0.0f, 1.0f); // 设置颜色为红色

glVertexPointer(3, GL_FLOAT, 0, gVerticesSquare); // 指定顶点数组

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 绘制正方形



// 关闭顶点数组

glDisableClientState(GL_VERTEX_ARRAY);

}



/************************************************************************/

/* JNI代码 */

/************************************************************************/



extern "C" {

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj, jint width, jint height);

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj);

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj);

};



JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj, jint width, jint height)

{

resize(width, height);

}



JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj)

{

renderFrame();

}



JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj)

{

init();

}

[Android.mk]

[html] view
plaincopy





LOCAL_PATH:= $(call my-dir)



include $(CLEAR_VARS)



LOCAL_MODULE := libgljni

LOCAL_CFLAGS := -Werror

LOCAL_SRC_FILES := gl_code.cpp

LOCAL_LDLIBS := -llog -lGLESv1_CM



include $(BUILD_SHARED_LIBRARY)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: