Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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
Android 在OpenGL ES二维正交(正交)模式下绘制问题_Android_Opengl Es - Fatal编程技术网

Android 在OpenGL ES二维正交(正交)模式下绘制问题

Android 在OpenGL ES二维正交(正交)模式下绘制问题,android,opengl-es,Android,Opengl Es,几天来,我一直在努力解决这个问题,在搜索了堆栈溢出和web之后,我还没有找到任何适合我的例子。我终于得到了似乎很接近的代码,所以也许你们可以帮我解决这个问题 我的第一个问题是,我试图通过将屏幕抓取作为纹理来实现运动模糊,然后使用透明度在下一帧上绘制纹理——或者使用更多帧实现更多模糊。(如果有人感兴趣,这是我遵循的指南:) 我已将屏幕保存为纹理,效果良好。我遇到的问题是在屏幕顶部以正交模式绘制。经过一番努力,我终于画出了一幅基本的正方形,但我对OpenGL ES的理解和一个简单易懂的例子的缺乏让我

几天来,我一直在努力解决这个问题,在搜索了堆栈溢出和web之后,我还没有找到任何适合我的例子。我终于得到了似乎很接近的代码,所以也许你们可以帮我解决这个问题

我的第一个问题是,我试图通过将屏幕抓取作为纹理来实现运动模糊,然后使用透明度在下一帧上绘制纹理——或者使用更多帧实现更多模糊。(如果有人感兴趣,这是我遵循的指南:)

我已将屏幕保存为纹理,效果良好。我遇到的问题是在屏幕顶部以正交模式绘制。经过一番努力,我终于画出了一幅基本的正方形,但我对OpenGL ES的理解和一个简单易懂的例子的缺乏让我现在却步了。我需要将保存的纹理绘制到我绘制的正方形中。我所做的一切似乎都不管用

另外,我的第二个问题是将更复杂的三维模型绘制到正交模式。我似乎无法画出任何模型。我正在使用(稍微定制的)min3d框架(http://code.google.com/p/min3d/),我尝试在正交模式下绘制Object3d,就像在透视模式下绘制一样。据我理解,他们应该画同样的画,他们不应该有深度。然而,我似乎根本看不到他们

这是我正在使用的代码。我尝试了很多不同的东西,这是我得到的最接近的东西(实际上在屏幕上画了一些可以看到的东西)。我仍然不知道如何在正交视图中获得正确的三维模型。我确信我犯了一些可怕的错误,可能完全误解了OpenGL绘图的一些基本方面。如果还有其他代码需要发布,请告诉我

// Gets called once, before all drawing occurs
//
private void reset()
{
    // Reset TextureManager
    Shared.textureManager().reset();

    // Do OpenGL settings which we are using as defaults, or which we will not be changing on-draw

    // Explicit depth settings
    _gl.glEnable(GL10.GL_DEPTH_TEST);                                   
    _gl.glClearDepthf(1.0f);
    _gl.glDepthFunc(GL10.GL_LESS);                                      
    _gl.glDepthRangef(0,1f);                                            
    _gl.glDepthMask(true);                                              

    // Alpha enabled
    _gl.glEnable(GL10.GL_BLEND);                                        
    _gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);    

    // "Transparency is best implemented using glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
    // with primitives sorted from farthest to nearest."

    // Texture
    _gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); // (OpenGL default is GL_NEAREST_MIPMAP)
    _gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); // (is OpenGL default)

    // CCW frontfaces only, by default
    _gl.glFrontFace(GL10.GL_CCW);
    _gl.glCullFace(GL10.GL_BACK);
    _gl.glEnable(GL10.GL_CULL_FACE);

    // Disable lights by default
    for (int i = GL10.GL_LIGHT0; i < GL10.GL_LIGHT0 + NUM_GLLIGHTS; i++) {
        _gl.glDisable(i);
    }

    //
    // Scene object init only happens here, when we get GL for the first time
    // 
}

// Called every frame
//
protected void drawScene()
{   
    if(_scene.fogEnabled() == true) {
        _gl.glFogf(GL10.GL_FOG_MODE, _scene.fogType().glValue());
        _gl.glFogf(GL10.GL_FOG_START, _scene.fogNear());
        _gl.glFogf(GL10.GL_FOG_END, _scene.fogFar());
        _gl.glFogfv(GL10.GL_FOG_COLOR, _scene.fogColor().toFloatBuffer() );
        _gl.glEnable(GL10.GL_FOG);
    } else {
        _gl.glDisable(GL10.GL_FOG);
    }

    // Sync all of the object drawing so that updates in the mover
    // thread can be synced if necessary
    synchronized(Renderer.SYNC)
    {
        for (int i = 0; i < _scene.children().size(); i++)
        {
            Object3d o = _scene.children().get(i);
            if(o.animationEnabled())
            {
                ((AnimationObject3d)o).update();
            }
            drawObject(o);
        }
    }

    //
    //
    //
    // Draw the blur

    // Set Up An Ortho View
    _switchToOrtho();

    _drawMotionBlur();

    // Switch back to the previous view
    _switchToPerspective();

    _saveScreenToTexture("blur", 512);
}

private void _switchToOrtho()
{
    // Set Up An Ortho View
    _gl.glDisable(GL10.GL_DEPTH_TEST);
    _gl.glMatrixMode(GL10.GL_PROJECTION); // Select Projection
    _gl.glPushMatrix(); // Push The Matrix
    _gl.glLoadIdentity(); // Reset The Matrix
    _gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f);
    //_gl.glOrthof(0f, 480f, 0f, 800f, -100f, 100f);
    _gl.glMatrixMode(GL10.GL_MODELVIEW); // Select Modelview Matrix
    _gl.glPushMatrix(); // Push The Matrix
    _gl.glLoadIdentity(); // Reset The Matrix
}

private void _switchToPerspective()
{
    // Switch back to the previous view
    _gl.glEnable(GL10.GL_DEPTH_TEST);
    _gl.glMatrixMode(GL10.GL_PROJECTION);
    _gl.glPopMatrix();
    _gl.glMatrixMode(GL10.GL_MODELVIEW);
    _gl.glPopMatrix(); // Pop The Matrix
}

private void _saveScreenToTexture(String $textureId, int $size)
{
    // Save the screen as a texture
    _gl.glViewport(0, 0, $size, $size);
    _gl.glBindTexture(GL10.GL_TEXTURE_2D, _textureManager.getGlTextureId($textureId));
    _gl.glCopyTexImage2D(GL10.GL_TEXTURE_2D,0,GL10.GL_RGB,0,0,512,512,0);
    _gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    _gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    _gl.glViewport(0, 0, 480, 800);
}

private void _drawMotionBlur()
{
    // Vertices
    float squareVertices[] = {
        -3f, 0f,     // Bottom Left
        475f, 0f,     // Bottom Right
        475f, 800f, // Top Right
        -3f, 800f  // Top Left
    };

    ByteBuffer vbb = ByteBuffer.allocateDirect(squareVertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    FloatBuffer vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(squareVertices);
    vertexBuffer.position(0);

    //
    //
    // Textures
    FloatBuffer textureBuffer;  // buffer holding the texture coordinates
    float texture[] = {         
            // Mapping coordinates for the vertices
            0.0f, 1.0f,     // top left     (V2)
            0.0f, 0.0f,     // bottom left  (V1)
            1.0f, 1.0f,     // top right    (V4)
            1.0f, 0.0f      // bottom right (V3)
    };
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(squareVertices.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    byteBuffer = ByteBuffer.allocateDirect(texture.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuffer.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);
    //
    //
    //

    _gl.glLineWidth(3.0f);
    _gl.glTranslatef(5.0f, 0.0f, 0.0f);
    _gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
    _gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    _gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
    //_gl.glTranslatef(100.0f, 0.0f, 0.0f);
    //_gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
    //_gl.glTranslatef(100.0f, 0.0f, 0.0f);
    //_gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);


    _gl.glEnable(GL10.GL_TEXTURE_2D);
    _gl.glEnable(GL10.GL_BLEND);
    _gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    _gl.glLoadIdentity();

    //
    //
    //
    _gl.glBindTexture(GL10.GL_TEXTURE_2D, _textureManager.getGlTextureId("blur"));
    _gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    _gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    //
    //
    //

    _gl.glDisable(GL10.GL_BLEND);
    _gl.glDisable(GL10.GL_TEXTURE_2D);
    _gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
//在所有绘图发生之前调用一次
//
私有无效重置()
{
//重置纹理管理器
Shared.textureManager().reset();
//做OpenGL设置,我们正在使用的默认设置,或我们将不会改变绘图
//显式深度设置
_gl.glEnable(GL10.gl_深度_试验);
_gl.glClearDepthf(1.0f);
_gl.glDepthFunc(GL10.gl_-LESS);
_gl.glDepthRangef(0,1f);
_gl.glDepthMask(真);
//阿尔法启用
_glEnable(GL10.Glu混合物);
_gl.glBlendFunc(GL10.gl_SRC_ALPHA,GL10.gl_ONE_减去SRC_ALPHA);
//“透明度最好使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去grc_ALPHA)实现
//基本体从最远到最近排序。”
//质地
_gl.glTexParameterf(GL10.gl_纹理_2D,GL10.gl_纹理_最小_过滤器,GL10.gl_最近);/(OpenGL默认为gl_最近_MIPMAP)
_GL10.glTexParameterf(GL10.gl_纹理_2D,GL10.gl_纹理_贴图过滤器,GL10.gl_线性);/(是OpenGL的默认设置)
//默认情况下,仅CCW正面
_gl.glFrontFace(GL10.GLU CCW);
_gl.glCullFace(GL10.glu BACK);
_gl.glEnable(GL10.gl_CULL_面);
//默认情况下禁用灯光
对于(int i=GL10.GL\u LIGHT0;i// Called every frame
//
protected void drawScene()
{   
    // Draw the 3d models in perspective mode
    // This part works (uses min3d) and draws a 3d scene
    //
    for (int i = 0; i < _scene.children().size(); i++)
    {
        Object3d o = _scene.children().get(i);
        if(o.animationEnabled())
        {
            ((AnimationObject3d)o).update();
        }
        drawObject(o);
    }

    // Set Up The Ortho View to draw a square with a texture
    // over the 3d scene
    //
    _gl.glDisable(GL10.GL_DEPTH_TEST);
    _gl.glMatrixMode(GL10.GL_PROJECTION); // Select Projection
    _gl.glPushMatrix(); // Push The Matrix
    _gl.glLoadIdentity(); // Reset The Matrix
    _gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f);
    _gl.glMatrixMode(GL10.GL_MODELVIEW); // Select Modelview Matrix
    _gl.glPushMatrix(); // Push The Matrix
    _gl.glLoadIdentity(); // Reset The Matrix


    // Draw A Square With A Texture
    // (Assume that the texture "blur" is already created properly --
    // it is as I can use it when drawing my 3d scene if I apply it
    // to one of the min3d objects)
    //
    float squareVertices[] = {
        -3f, 0f,     // Bottom Left
        475f, 0f,     // Bottom Right
        475f, 800f, // Top Right
        -3f, 800f  // Top Left
    };

    ByteBuffer vbb = ByteBuffer.allocateDirect(squareVertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    FloatBuffer vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(squareVertices);
    vertexBuffer.position(0);

    FloatBuffer textureBuffer;  // buffer holding the texture coordinates
    float texture[] = {         
            // Mapping coordinates for the vertices
            0.0f, 1.0f,     // top left     (V2)
            0.0f, 0.0f,     // bottom left  (V1)
            1.0f, 1.0f,     // top right    (V4)
            1.0f, 0.0f      // bottom right (V3)
    };
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(squareVertices.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    byteBuffer = ByteBuffer.allocateDirect(texture.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuffer.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);

    _gl.glLineWidth(3.0f);
    _gl.glTranslatef(5.0f, 0.0f, 0.0f);
    _gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
    _gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    _gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);

    _gl.glEnable(GL10.GL_TEXTURE_2D);
    _gl.glEnable(GL10.GL_BLEND);
    _gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    _gl.glLoadIdentity();

    _gl.glBindTexture(GL10.GL_TEXTURE_2D, _textureManager.getGlTextureId("blur"));
    _gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    _gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

    _gl.glDisable(GL10.GL_BLEND);
    _gl.glDisable(GL10.GL_TEXTURE_2D);
    _gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    // Switch Back To The Perspective Mode
    //
    _gl.glEnable(GL10.GL_DEPTH_TEST);
    _gl.glMatrixMode(GL10.GL_PROJECTION);
    _gl.glPopMatrix();
    _gl.glMatrixMode(GL10.GL_MODELVIEW);
    _gl.glPopMatrix(); // Pop The Matrix
}