Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android OpenGL ES 2.0中渲染纹理原语-我做错了什么?_Java_Android_Opengl Es_Opengl Es 2.0_Textures - Fatal编程技术网

Java 在Android OpenGL ES 2.0中渲染纹理原语-我做错了什么?

Java 在Android OpenGL ES 2.0中渲染纹理原语-我做错了什么?,java,android,opengl-es,opengl-es-2.0,textures,Java,Android,Opengl Es,Opengl Es 2.0,Textures,我正在为Android()编写一个开源游戏引擎,在渲染纹理三角形时遇到了一些问题。OpenGL不会报告任何错误,但不会渲染任何内容。我可以很好地渲染顶点颜色的三角形,所以我知道我的VBO和着色器加载函数可以工作。我有一种感觉,我只是错过了一些小细节。以下是相关代码: // loaded is a boolean field if(!loaded ){ int[] tex = { 0 }; GLES20.glGenTextures(1, tex, 0); int hand

我正在为Android()编写一个开源游戏引擎,在渲染纹理三角形时遇到了一些问题。OpenGL不会报告任何错误,但不会渲染任何内容。我可以很好地渲染顶点颜色的三角形,所以我知道我的VBO和着色器加载函数可以工作。我有一种感觉,我只是错过了一些小细节。以下是相关代码:

// loaded is a boolean field 
if(!loaded ){
    int[] tex = { 0 };
    GLES20.glGenTextures(1, tex, 0);
    int handle = tex[0];

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, handle);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
            GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
            GLES20.GL_CLAMP_TO_EDGE);
    if (useMipmaps) {
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_LINEAR_MIPMAP_NEAREST);
    } else {
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    }
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    // bmp is an android.graphics.Bitmap object
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
    if (useMipmaps)
        GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
    loaded = true;
}

GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + glTexture);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, handle);
GLES20.glUniform1i(GLES20.glGetUniformLocation(programHandle,
                "s_baseMap"), glTexture);

GLES20.glDrawElements(GLES20.GL_TRIANGLES,
                    indexCount, GLES20.GL_UNSIGNED_SHORT, 0);
顶点着色器:

precision mediump float;

uniform mat4 u_viewProj;
uniform vec3 u_lightColor;

attribute mat4 a_model;
attribute vec4 a_pos;
attribute vec2 a_mtl; // Stores UV coords

varying vec2 v_tc;

void main() {
    gl_Position = (u_viewProj * a_model) * a_pos;
    v_tc = a_mtl;
}
和片段着色器:

precision mediump float;

varying vec2 v_tc;

uniform sampler2D s_baseMap;

void main() {
    vec4 black = vec4(0.0, 0.0, 0.0, 1.0);
    gl_FragColor = black + texture2D(s_baseMap, v_tc);
}

我解决了。问题根本不在纹理或碎片着色器中。这与模型矩阵属性加载到顶点着色器的方式有关。我的矩阵加载代码如下:

GLES20.glDisableVertexAttribArray(a_model);
GLES20.glVertexAttrib4fv(a_model, matrix, matrixOffset * 16);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 4);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 8);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 12);
是的,这是我在中删除的“不必要”代码的一部分*掌纹*

原来,
a_model
是模型矩阵第一行的位置。因为我只将数据加载到第一行,所以矩阵的最后三行是空的,所以顶点位置被弄乱,三角形退化。我通过为每个连续行的
a_model
添加1来修复此问题,如下所示:

GLES20.glDisableVertexAttribArray(a_model);
GLES20.glDisableVertexAttribArray(a_model + 1);
GLES20.glDisableVertexAttribArray(a_model + 2);
GLES20.glDisableVertexAttribArray(a_model + 3);
GLES20.glVertexAttrib4fv(a_model, matrix, matrixIndex * 16);
GLES20.glVertexAttrib4fv(a_model + 1, matrix, (matrixIndex * 16) + 4);
GLES20.glVertexAttrib4fv(a_model + 2, matrix, (matrixIndex * 16) + 8);
GLES20.glVertexAttrib4fv(a_model + 3, matrix, (matrixIndex * 16) + 12);

现在它工作得很好

您是否使用过glEnable(GLES20.GL_纹理_2D)任何地方?
glEnable(GLES20.GL_纹理_2D)导致无效的枚举错误,如所示。我很确定这在GLES 2.0中是不必要的。检查
glGenTextures
实际生成的值。如果它给你一些100000的随机数,那么你可能不想使用它,而是想用你自己的系统来生成唯一的纹理ID。当我将我的应用程序从opengl ES 1.1转换为opengl ES 2.0时,我遇到了这个问题。我检查了它,它生成了70001。这不正常吗?另外,不使用
glGenTextures
不会导致
glBindTextures
之类的操作失败吗?当我使用API lvl 7时,它会给出1,2,3,n+1,其中n是调用
glGenTextures
的次数。只有当我在具有更高API级别的较新设备上运行应用程序时,我才遇到此问题。我不知道GLuint的确切规格,所以可能70001是可以的,而其他地方的一些东西是失败的,但是如果你尝试使用多种纹理,你会很快发现
glGenTextures
也是一个问题。您不需要使用
glGenTextures
,只需将自己的ID插入
glBindTexture()
。这只是一种方便的方法,所以您不必跟踪ID