OpenGL for c++ 紋理繪製

文章目錄


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);
}

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章