Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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 纹理的使用与绘图三角形冲突,仅显示一个_Java_Android_Opengl Es_Textures - Fatal编程技术网

Java 纹理的使用与绘图三角形冲突,仅显示一个

Java 纹理的使用与绘图三角形冲突,仅显示一个,java,android,opengl-es,textures,Java,Android,Opengl Es,Textures,我目前正在学习使用Java/Android的OpenGL,到目前为止,所有问题都可以通过一个名为stackoverflow或google的网站解决,你可能都知道 到目前为止,我只画了三角形顶点和索引使用类似的东西 // some math here to calculate vertices and indices gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(COORDS_PER_VE

我目前正在学习使用Java/Android的OpenGL,到目前为止,所有问题都可以通过一个名为stackoverflow或google的网站解决,你可能都知道

到目前为止,我只画了三角形顶点和索引使用类似的东西

    // some math here to calculate vertices and indices
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, vertex_stride, vertex_buffer);
    gl.glColor4f(color.r, color.g, color.b, color.a);
    gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, index_buffer_size, GL10.GL_UNSIGNED_SHORT, index_buffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
vertex_缓冲区用于保存验证,index_缓冲区用于保存索引。 这是可行的,我可以画矩形、圆、箭头和其他简单的形状

现在我想添加一个纹理。我确实是这样做的:

它本身也起作用:

    // once: bitmap to texture conversion
    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    // do some math for the verices and the mapping

    // always: drawing
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, vertex_stride, vertex_buffer);
    gl.glTexCoordPointer(COORDS_PER_TEXTURE_COORD, GL10.GL_FLOAT, 0, texture_buffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, NUM_VERTICES);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
纹理[0]按住指向纹理的指针,顶点\u再次缓冲顶点,纹理\u缓冲纹理到顶点的映射,位图保存位图

现在如果我同时使用这两种方法,我发现openGL只绘制纹理。不会显示所有简单形状。如果我把应用程序放在背景中,然后再放在前景中,突然所有简单的形状都会显示出来,但是纹理变成了矩形,填充了随机的颜色,可能就是我画的最后一个简单形状的颜色。 如果我先画简单的形状,然后再画纹理,结果不会改变,反之亦然

我猜这只是一个电话 gl.glEnableClientStateGL10.gl_顶点数组; 对于简单的形状和,比gl.glEnableClientStateGL10.gl_顶点_数组更简单;和gl.glDisableClientStateGL10.gl_纹理_坐标_数组;因为纹理会发生某种冲突

有没有一种方法可以将两者用于同一帧

也许我需要在Render类中的openGL中配置一些东西

class OpenGLRenderer implements GLSurfaceView.Renderer {

    public OpenGLRenderer(Context c, int screen_width_px, int screen_height_px){
        context = c;
        this.screen_width_px = screen_width_px;
        this.screen_height_px = screen_height_px;
    }


    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig egl_config){
        gl10.glEnable(GL10.GL_TEXTURE_2D);
        gl10.glShadeModel(GL10.GL_SMOOTH);

        gl10.glClearColor(0.5f, 0.5f, 0.0f, 0.5f);
        gl10.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        gl10.glEnable(GL10.GL_DEPTH_TEST);
    }

    @Override
    public void onSurfaceChanged(GL10 gl10, int width, int height){
        screen_height_px = height;
        screen_width_px = width;

        GLES20.glViewport(0,0,width,height);
        float ratio  = (float) width / (float) height;
        gl10.glMatrixMode(GL10.GL_PROJECTION);
        gl10.glLoadIdentity();

        float near = 1.0f;
        float far = -zoom+1;
        float bottom = -1.0f;
        float top = 1.0f;
        float left = -ratio;
        float right = ratio;
        gl10.glFrustumf(left , right , bottom, top, near, far);
    }

    @Override
    public void onDrawFrame(GL10 gl10){

        prepareFrame(gl10);

        // HERE I would call all simple_shapes and Textures in two for loops
    }

    void prepareFrame(GL10 gl10){
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        gl10.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl10.glMatrixMode(GL10.GL_MODELVIEW);
        gl10.glLoadIdentity();
        gl10.glTranslatef(0.0f, 0.0f, zoom);
        gl10.glEnable(GL10.GL_BLEND);
        gl10.glEnable(GL10.GL_TEXTURE_2D);
        gl10.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    }  
}
我想这就是所有相关的代码。我不知道在这里发布Github项目的链接是否合适,但如果需要,我也可以创建一个分支并链接它

问题已解决:简而言之,我需要在绘制纹理之前启用2DTexture gl10.glEnableGL10.GL_TEXTURE_2D,然后禁用它gl10.glDisableGL10.GL_TEXTURE_2D。我刚刚启用了它。有关详细答案,请参阅已接受的答案


将应用程序移动到背景并返回前景后,纹理消失的问题与此无关。通过调用下面的部分//once:位图到纹理的转换再次查看第二个代码示例,解决了这个问题。我猜纹理[0]指针后面的纹理会被移动到后台的应用程序删除。

OpenGL是一个状态引擎。一旦设置了状态,它将一直保持,直到再次更改为止。二维纹理必须由gl10.glEnableGL10.GL_TEXTURE_2D;启用;。设置此状态后,将保持此状态。如果启用了二维纹理,但未提供纹理坐标,则网格的所有纹理坐标属性都必须具有默认值0,0,并且当前绑定纹理在该坐标处的纹理将在整个网格上包裹

在使用纹理绘制几何体之前,必须启用二维纹理:

gl10.glEnable(GL10.GL_TEXTURE_2D);
// draw mesh with texture
gl10.glDisable(GL10.GL_TEXTURE_2D);
// draw mesh with color
在绘制没有纹理的几何体之前,必须禁用二维纹理:

gl10.glEnable(GL10.GL_TEXTURE_2D);
// draw mesh with texture
gl10.glDisable(GL10.GL_TEXTURE_2D);
// draw mesh with color

OpenGL是一个状态引擎。一旦设置了状态,它将一直保持,直到再次更改为止。二维纹理必须由gl10.glEnableGL10.GL_TEXTURE_2D;启用;。设置此状态后,将保持此状态。如果启用了二维纹理,但未提供纹理坐标,则网格的所有纹理坐标属性都必须具有默认值0,0,并且当前绑定纹理在该坐标处的纹理将在整个网格上包裹

在使用纹理绘制几何体之前,必须启用二维纹理:

gl10.glEnable(GL10.GL_TEXTURE_2D);
// draw mesh with texture
gl10.glDisable(GL10.GL_TEXTURE_2D);
// draw mesh with color
在绘制没有纹理的几何体之前,必须禁用二维纹理:

gl10.glEnable(GL10.GL_TEXTURE_2D);
// draw mesh with texture
gl10.glDisable(GL10.GL_TEXTURE_2D);
// draw mesh with color

非常感谢,这就是问题所在。非常感谢,这就是问题所在。