作者说:我是一个灰常干脆的人,一点也不罗索,所以,直接上代码。XDXD
class="dp-cpp">-
-
- #include "Shader.vert"
- #include "Shader.frag"
-
- #include <jni.h>
- #include <android/log.h>
-
- #include <GLES2/gl2.h>
- #include <GLES2/gl2ext.h>
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
-
- enum {
- ATTRIB_VERTEX,
- ATTRIB_TEXTURE,
- };
-
- static GLuint g_texYId;
- static GLuint g_texUId;
- static GLuint g_texVId;
- static GLuint simpleProgram;
-
- static char * g_buffer = NULL;
- static int g_width = 0;
- static int g_height = 0;
-
-
- static void checkGlError(const char* op)
- {
- GLint error;
- for (error = glGetError(); error; error = glGetError())
- {
- log("error::after %s() glError (0x%x)\n", op, error);
- }
- }
-
- static GLuint bindTexture(GLuint texture, const char *buffer, GLuint w , GLuint h)
- {
-
-
- checkGlError("glGenTextures");
- glBindTexture ( GL_TEXTURE_2D, texture );
- checkGlError("glBindTexture");
- glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE
- , w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer);
- checkGlError("glTexImage2D");
- glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- checkGlError("glTexParameteri");
- glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- checkGlError("glTexParameteri");
- glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- checkGlError("glTexParameteri");
- glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- checkGlError("glTexParameteri");
-
-
- return texture;
- }
-
- static void renderFrame()
- {
- #if 0
-
- static GLfloat squareVertices[] = {
- -1.0f, -1.0f,
- 1.0f, -1.0f,
- -1.0f, 1.0f,
- 1.0f, 1.0f,
- };
-
- static GLfloat coordVertices[] = {
- 0.0f, 1.0f,
- 1.0f, 1.0f,
- 0.0f, 0.0f,
- 1.0f, 0.0f,
- };
- #else
-
- static GLfloat squareVertices[] = {
- 0.0f, 0.0f,
- 1.0f, 0.0f,
- 0.0f, 1.0f,
- 1.0f, 1.0f,
- };
-
- static GLfloat coordVertices[] = {
- -1.0f, 1.0f,
- 1.0f, 1.0f,
- -1.0f, -1.0f,
- 1.0f, -1.0f,
- };
- #endif
-
- glClearColor(0.5f, 0.5f, 0.5f, 1);
- checkGlError("glClearColor");
- glClear(GL_COLOR_BUFFER_BIT);
- checkGlError("glClear");
-
- GLint tex_y = glGetUniformLocation(simpleProgram, "SamplerY");
- checkGlError("glGetUniformLocation");
- GLint tex_u = glGetUniformLocation(simpleProgram, "SamplerU");
- checkGlError("glGetUniformLocation");
- GLint tex_v = glGetUniformLocation(simpleProgram, "SamplerV");
- checkGlError("glGetUniformLocation");
-
-
- glBindAttribLocation(simpleProgram, ATTRIB_VERTEX, "vPosition");
- checkGlError("glBindAttribLocation");
- glBindAttribLocation(simpleProgram, ATTRIB_TEXTURE, "a_texCoord");
- checkGlError("glBindAttribLocation");
-
- glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
- checkGlError("glVertexAttribPointer");
- glEnableVertexAttribArray(ATTRIB_VERTEX);
- checkGlError("glEnableVertexAttribArray");
-
- glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices);
- checkGlError("glVertexAttribPointer");
- glEnableVertexAttribArray(ATTRIB_TEXTURE);
- checkGlError("glEnableVertexAttribArray");
-
- glActiveTexture(GL_TEXTURE0);
- checkGlError("glActiveTexture");
- glBindTexture(GL_TEXTURE_2D, g_texYId);
- checkGlError("glBindTexture");
- glUniform1i(tex_y, 0);
- checkGlError("glUniform1i");
-
- glActiveTexture(GL_TEXTURE1);
- checkGlError("glActiveTexture");
- glBindTexture(GL_TEXTURE_2D, g_texUId);
- checkGlError("glBindTexture");
- glUniform1i(tex_u, 1);
- checkGlError("glUniform1i");
-
- glActiveTexture(GL_TEXTURE2);
- checkGlError("glActiveTexture");
- glBindTexture(GL_TEXTURE_2D, g_texVId);
- checkGlError("glBindTexture");
- glUniform1i(tex_v, 2);
- checkGlError("glUniform1i");
-
-
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- checkGlError("glDrawArrays");
- }
-
- static GLuint buildShader(const char* source, GLenum shaderType)
- {
- GLuint shaderHandle = glCreateShader(shaderType);
-
- if (shaderHandle)
- {
- glShaderSource(shaderHandle, 1, &source, 0);
- glCompileShader(shaderHandle);
-
- GLint compiled = 0;
- glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compiled);
- if (!compiled)
- {
- GLint infoLen = 0;
- glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &infoLen);
- if (infoLen)
-
|