2013-08-28 72 views
-1

我使用https://github.com/d3kod/Texample2中的代码在OpenGL 2.0中呈现文本。该项目的解释可以在http://primalpond.wordpress.com/2013/02/26/rendering-text-in-opengl-2-0-es-on-android/glEnableVertexAttribArray上的OpenGL 2.0 ES 1281错误

该代码在我运行android 4.1.2的三星Galaxy S3上效果很好。然而,它不适用于运行android 2.3.4的我的Droid X,而其他人在Android 4.0.4 Onepad 940平板电脑上遇到了这个问题(请参阅http://primalpond.wordpress.com/2013/02/26/rendering-text-in-opengl-2-0-es-on-android/#comment-89)。

我收到了1281错误就行了: GLES20.glEnableVertexAttribArray(mColorHandle)

我已经确定,这是因为在我的Droid X的GL_MAX_VERTEX_ATTRIBS只有8,当我上运行我的应用程序mColorHandle设置为26。我的三星GS3,GL_MAX_VERTEX_ATTRIBS是16,但mColorHandle设置为0.

因此,由于26> 8,1281错误被抛出。我不明白为什么在Droid得到的26句柄值和GS3得到0

mProgram程序设置在此行中的对象的构造函数:

mColorHandle = GLES20.glGetUniformLocation(mProgram.getHandle(), "u_Color"); 

这是该行创建错误:

void initDraw(float red, float green, float blue, float alpha) { 
GLES20.glUseProgram(mProgram.getHandle()); // specify the program to use 

// set color TODO: only alpha component works, text is always black #BUG 
float[] color = {red, green, blue, alpha}; 
GLES20.glUniform4fv(mColorHandle, 1, color , 0); 
GLES20.glEnableVertexAttribArray(mColorHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // Set the active texture unit to texture unit 0 

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); // Bind the texture to this unit 

// Tell the texture uniform sampler to use this texture in the shader by binding to texture unit 0 
GLES20.glUniform1i(mTextureUniformHandle, 0); 
//Log.i("error", "glerror3: " + GLES20.glGetError()); 
} 

编辑

这是设置程序的类:

public class BatchTextProgram extends Program { 

private static final AttribVariable[] programVariables = { 
    AttribVariable.A_Position, AttribVariable.A_TexCoordinate, AttribVariable.A_MVPMatrixIndex 
}; 

private static final String vertexShaderCode = 
     "uniform mat4 u_MVPMatrix[24];  \n"  // An array representing the combined 
                // model/view/projection matrices for each sprite 

     + "attribute float a_MVPMatrixIndex; \n" // The index of the MVPMatrix of the particular sprite 
     + "attribute vec4 a_Position;  \n"  // Per-vertex position information we will pass in. 
     + "attribute vec2 a_TexCoordinate;\n"  // Per-vertex texture coordinate information we will pass in 
     + "varying vec2 v_TexCoordinate; \n" // This will be passed into the fragment shader. 
     + "void main()     \n"  // The entry point for our vertex shader. 
     + "{        \n" 
     + " int mvpMatrixIndex = int(a_MVPMatrixIndex); \n" 
     + " v_TexCoordinate = a_TexCoordinate; \n" 
     + " gl_Position = u_MVPMatrix[mvpMatrixIndex] \n"  // gl_Position is a special variable used to store the final position. 
     + "    * a_Position; \n"  // Multiply the vertex by the matrix to get the final point in 
               // normalized screen coordinates. 
     + "}        \n";  


private static final String fragmentShaderCode = 
     "uniform sampler2D u_Texture;  \n" // The input texture. 
     + "precision mediump float;  \n"  // Set the default precision to medium. We don't need as high of a 
     // precision in the fragment shader. 
     + "uniform vec4 u_Color;   \n" 
     + "varying vec2 v_TexCoordinate; \n" // Interpolated texture coordinate per fragment. 

     + "void main()     \n"  // The entry point for our fragment shader. 
     + "{        \n" 
     + " gl_FragColor = texture2D(u_Texture, v_TexCoordinate).w * u_Color;\n" // texture is grayscale so take only grayscale value from 
                        // it when computing color output (otherwise font is always black) 
     + "}        \n"; 

@Override 
public void init() { 
    super.init(vertexShaderCode, fragmentShaderCode, programVariables); 
} 

} 
+0

我被困在相同的问题,你有没有找到解决办法?我使用的是Texample2代码,但看起来这是代码中的一个错误。 – neur0tic

回答

1

您的逻辑被破坏。如果u_Color是统一的,则它不能是顶点属性。修复。

+0

我在上面添加了着色器代码。你是不是要说把''uniform vec4 u_Color''换成别的东西,比如'attribute vec4 u_Color'。那么我将如何更改'mColorHandle'赋值? (我尝试了几件没有运气的东西。) – eonor

+0

我不是说改变几行。您似乎并不知道OpenGL中的顶点属性和统一之间的区别。对它们进行一些研究,你会很快理解为什么我说“你的逻辑被破坏了”。 –