文章目錄
1、加載shader和生成program過程不變
2、創建和綁定紋理:
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureid);
3、設置環繞和過濾方式
環繞(超出紋理座標範圍):
(s==x t==y GL_REPEAT 重複)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
過濾(紋理像素映射到座標點):(縮小、放大:GL_LINEAR線性)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
4、設置圖片(byte[] data)
glTexImage2D(GL_
TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
5、綁定頂點座標和紋理座標
6、繪製圖形
調用代碼
#include <jni.h>
#include <string>
#include "EGL/egl.h"
#include "GLES2/gl2.h"
#include "android/native_window.h"
#include <android/native_window.h>
#include <android/native_window_jni.h>
#include <GLES2/gl2.h>
#include "egl/XYEglThread.h"
#include "shaderutil/ShaderUtil.h"
XYEglThread *eglThread = NULL;
ANativeWindow *nativeWindow = NULL;
const char *vertex = "attribute vec4 v_Position;\n"
"attribute vec2 f_Position;\n"
"varying vec2 ft_Position;\n"
"void main() {\n"
" ft_Position = f_Position;\n"
" gl_Position = v_Position;\n"
"}";
const char *fragment = "precision mediump float;\n"
"varying vec2 ft_Position;\n"
"uniform sampler2D sTexture;\n"
"void main() {\n"
" gl_FragColor=texture2D(sTexture, ft_Position);\n"
"}";
int program;
GLint vPosition;
GLint fPosition;
GLint sampler;
GLuint textureId;//
int w;
int h;
void *pixels = NULL;
//頂點數據
//float vertexs[] = {
// -1, -1,
//// 1, 0,
// 1,-1,
// 0, 1
//};
float vertexs[] = {
1, -1,
1, 1,
-1, -1,
-1, 1
};
//紋理座標
float fragments[] = {
1, 1,
1, 0,
0, 1,
0, 0
};
void callback_SurfaceCreate(void *ctx) {
LOGD("callback_SurfaceCreate")
XYEglThread *wlEglThread = static_cast<XYEglThread *>(ctx);
program = createProgram(vertex, fragment);
LOGD("opengl program %d", program)
//頂點座標
vPosition = glGetAttribLocation(program, "v_Position");
//紋理座標
fPosition = glGetAttribLocation(program, "f_Position");
//2d 紋理
sampler = glGetUniformLocation(program, "sTexture");
//生成紋理
glGenTextures(1, &textureId);
//綁定紋理
glBindTexture(GL_TEXTURE_2D, textureId);
//環繞和過濾方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
if (pixels != NULL) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
//解綁
glBindTexture(GL_TEXTURE_2D, 0);//0就是解綁
}
void callback_SurfaceChange(int w, int h, void *ctx) {
LOGD("callback_SurfaceChange")
XYEglThread *wlEglThread = static_cast<XYEglThread *>(ctx);
LOGD("w = %d, h = %d", w, h)
glViewport(0, 0, w, h);
}
void callback_SurfaceOndraw(void *ctx) {
LOGD("callback_SurfaceDraw");
XYEglThread *xyEglThread = static_cast<XYEglThread *>(ctx);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//使用program 賦值的操作 數據傳遞的操作都在這個useProgram之後
glUseProgram(program);
// glActiveTexture(GL_TEXTURE5);
// glUniform1i(sampler, 5);
//綁定紋理id
glBindTexture(GL_TEXTURE_2D, textureId);
//啓用頂點
glEnableVertexAttribArray(vPosition);//可用
glVertexAttribPointer(vPosition, 2, GL_FLOAT, false, 8, vertexs);//賦值
//啓用紋理
glEnableVertexAttribArray(fPosition);
glVertexAttribPointer(fPosition, 2, GL_FLOAT, false, 8, fragments);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//兩個三角形
// glDrawArrays(GL_TRIANGLES, 0, 3);
//繪製完成後解綁
glBindTexture(GL_TEXTURE_2D, 0);//0就是解綁
}
extern "C"
JNIEXPORT void JNICALL
Java_com_xy_www_opengl4c_opengl_NativeOpengl_surfaceCreate(JNIEnv *env, jobject instance,
jobject surface) {
nativeWindow = ANativeWindow_fromSurface(env, surface);
eglThread = new XYEglThread();
eglThread->setRenderType(OPENGL_RENDER_HANDLE);
eglThread->callBackOnCreate(callback_SurfaceCreate, eglThread);
eglThread->callBackOnChange(callback_SurfaceChange, eglThread);
eglThread->callBackOnDraw(callback_SurfaceOndraw, eglThread);
eglThread->onSurfaceCreate(nativeWindow);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_xy_www_opengl4c_opengl_NativeOpengl_surfaceChange(JNIEnv *env, jobject instance,
jint width, jint height) {
// TODO
if (eglThread != NULL) {
eglThread->onSurfaceChange(width, height);
usleep(1000000);
eglThread->notifyRender();
}
}
extern "C"
JNIEXPORT void JNICALL
Java_com_xy_www_opengl4c_opengl_NativeOpengl_imgData(JNIEnv *env, jobject instance, jint width,
jint height, jint length, jbyteArray data_) {
jbyte *data = env->GetByteArrayElements(data_, NULL);
w = width;
h = height;
pixels = malloc(length);
memcpy(pixels, data, length);//內存拷貝
env->ReleaseByteArrayElements(data_, data, 0);
}