I'm developing an Android application with OpenGL ES 2.0 native code.
The native code compiles ok, and runs without any problem. But it doesn't draw anything.
Here is my code:
##################################################################################
#include <jni.h>#include <android/log.h>#include <stdio.h>#include <string.h>#include <GLES2/gl2.h>#include <GLES2/gl2ext.h>#ifdef __cplusplusextern "C"{#endif unsigned int shaderProgramID; GLint vertexHandle; GLint normalHandle; GLint textureCoordHandle;// Constants:static const float kObjectScale = 3.f;static const char* cubeMeshVertexShader = "attribute vec4 vertexPosition;attribute vec4 vertexNormal;attribute vec2 vertexTexCoord; varying vec2 texCoord;varying vec4 normal; uniform mat4 modelViewProjectionMatrix;void main() { gl_Position = modelViewProjectionMatrix * vertexPosition; normal = vertexNormal; texCoord = vertexTexCoord;} ";static const char* cubeMeshFragmentShader = "precision mediump float;varying vec2 texCoord;varying vec4 normal;uniform sampler2D texSampler2D;void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);} ";static const char* meshVertexShaderNoNormalTexCoor = "attribute vec4 vertexPosition;void main() { gl_Position = vertexPosition;} ";static const char* fragmentShaderNoNormalTexCoor = "precision mediump float;void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);} ";unsigned intinitShader(unsigned int shaderType, const char* source){ GLuint shader = glCreateShader((GLenum)shaderType); if (shader) { glShaderSource(shader, 1, &source, NULL); glCompileShader(shader); GLint compiled = 0; glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); if (!compiled) { GLint infoLen = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); if (infoLen) { char* buf = (char*) malloc(infoLen); if (buf) { glGetShaderInfoLog(shader, infoLen, NULL, buf); free(buf); } glDeleteShader(shader); shader = 0; } } } return shader;}unsigned intcreateProgramFromBuffer(const char* vertexShaderBuffer, const char* fragmentShaderBuffer){ GLuint vertexShader = initShader(GL_VERTEX_SHADER, vertexShaderBuffer); if (!vertexShader) { __android_log_write(ANDROID_LOG_ERROR, "createProgramFromBuffer", "init-vertexShader"); return 0; } GLuint fragmentShader = initShader(GL_FRAGMENT_SHADER, fragmentShaderBuffer); if (!fragmentShader) { __android_log_write(ANDROID_LOG_ERROR, "createProgramFromBuffer", "init-fragmentShader"); return 0; } GLuint program = glCreateProgram(); if (program) { glAttachShader(program, vertexShader); glAttachShader(program, fragmentShader); glLinkProgram(program); GLint linkStatus = GL_FALSE; glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); if (linkStatus != GL_TRUE) { GLint bufLength = 0; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); if (bufLength) { char* buf = (char*) malloc(bufLength); if (buf) { glGetProgramInfoLog(program, bufLength, NULL, buf); free(buf); } } glDeleteProgram(program); program = 0; __android_log_write(ANDROID_LOG_ERROR, "glGetProgramiv", "linkStatus"); } } __android_log_write(ANDROID_LOG_VERBOSE, "LoaderRenderer", "createProgramFromBuffer-OK"); return program;}JNIEXPORT void JNICALL Java_com_company_tests_LoaderRenderer_initRendering (JNIEnv *env, jobject obj, jint numVNormal, jint numVTexCoord, jint width, jint heigth){ glViewport(0, 0, width, heigth); // Define clear color glClearColor(0.0f, 0.0f, 0.0f, 0.0f); if ((numVNormal > 0) && (numVTexCoord > 0)) { __android_log_write(ANDROID_LOG_VERBOSE, "initRendering", "(numVNormal > 0) && (numVTexCoord > 0)"); shaderProgramID = createProgramFromBuffer(cubeMeshVertexShader, cubeMeshFragmentShader); normalHandle = glGetAttribLocation(shaderProgramID, "vertexNormal"); textureCoordHandle = glGetAttribLocation(shaderProgramID, "vertexTexCoord"); } else if (numVNormal == 0) { if (numVTexCoord == 0) { __android_log_write(ANDROID_LOG_VERBOSE, "initRendering", "(numVNormal == 0) && (numVTexCoord == 0)"); shaderProgramID =createProgramFromBuffer(meshVertexShaderNoNormalTexCoor, fragmentShaderNoNormalTexCoor); } else { __android_log_write(ANDROID_LOG_VERBOSE, "initRendering", "(numVNormal == 0) && (numVTexCoord > 0)"); shaderProgramID = createProgramFromBuffer(meshVertexShaderNoNormalTexCoor, fragmentShaderNoNormalTexCoor); textureCoordHandle = glGetAttribLocation(shaderProgramID, "vertexTexCoord"); } } else if ((numVNormal > 0) && (numVTexCoord == 0)) { __android_log_write(ANDROID_LOG_VERBOSE, "initRendering", "(numVNormal > 0) && (numVTexCoord == 0)"); shaderProgramID =createProgramFromBuffer(meshVertexShaderNoNormalTexCoor, fragmentShaderNoNormalTexCoor); normalHandle = glGetAttribLocation(shaderProgramID, "vertexNormal"); } vertexHandle = glGetAttribLocation(shaderProgramID, "vertexPosition"); __android_log_write(ANDROID_LOG_VERBOSE, "LoaderRenderer", "initRendering-OK");}JNIEXPORT void JNICALL Java_com_company_tests_LoaderRenderer_updateRendering( JNIEnv* env, jobject obj, jint width, jint heigth){ // Set the viewport glViewport(0, 0, width, heigth); // Clear the color buffer glClear(GL_COLOR_BUFFER_BIT);}JNIEXPORT void JNICALL Java_com_company_tests_LoaderRenderer_renderFrame(JNIEnv *env, jobject obj, jfloatArray vertices, jfloatArray normals, jfloatArray texCoord, jintArray indices){ jfloat *vertPos, *vertNorm, *vertTexC; jint *indicesArray; jsize numNormals = env->GetArrayLength(normals); jsize numTexCoords = env->GetArrayLength(texCoord); GLsizei numIndices = (GLsizei) env->GetArrayLength(indices); vertPos = env->GetFloatArrayElements(vertices, 0); indicesArray = env->GetIntArrayElements(indices, 0); if (numNormals > 0) vertNorm = env->GetFloatArrayElements(normals, 0); if (numTexCoords > 0) vertTexC = env->GetFloatArrayElements(texCoord, 0); // Clear color and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glUseProgram(shaderProgramID); glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) vertPos); if (numNormals > 0) glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) vertNorm); if (numTexCoords > 0) glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) vertTexC); glEnableVertexAttribArray(vertexHandle); if (numNormals > 0) glEnableVertexAttribArray(normalHandle); if (numTexCoords > 0) { glEnableVertexAttribArray(textureCoordHandle); } glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, (const GLvoid*) indicesArray); glDisable(GL_DEPTH_TEST); glDisableVertexAttribArray(vertexHandle); if (numNormals > 0) glDisableVertexAttribArray(normalHandle); if (numTexCoords > 0) glDisableVertexAttribArray(textureCoordHandle); if (numNormals > 0) env->ReleaseFloatArrayElements(normals, vertNorm, 0); if (numTexCoords > 0) env->ReleaseFloatArrayElements(texCoord, vertTexC, 0); env->ReleaseFloatArrayElements(vertices, vertPos, 0); env->ReleaseIntArrayElements(indices, indicesArray, 0);}#ifdef __cplusplus}#endif
Please, do you see where is my error?
Thanks.
[Edited by - VansFannel on December 8, 2010 7:52:35 AM]