【问题标题】:Drawing quad in OpenGL ES on Android在 Android 上的 OpenGL ES 中绘制四边形
【发布时间】:2011-06-26 03:56:22
【问题描述】:

我只是想了解这里发生了什么。我在屏幕上有一个纹理四边形,但我真的很困惑为什么它会占据整个屏幕。如果我的纹理是 64X64 并且我想要屏幕左上角的一个 64X64 的四边形,我需要更改什么?是我的视口还是我的顶点位置导致它占据了整个屏幕?

到目前为止的变化:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        myquad.loadGLTexture(gl, this.context);

        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(gl.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glDisable(GL10.GL_DEPTH_TEST);
    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {
        width=w;
        height=h;
        gl.glViewport(0, 0, w, h);
        gl.glLoadIdentity();
        gl.glOrthof(0.0f, w, 0, h, -1.0f, 1.0f);        
    }

    public void onDrawFrame(GL10 gl) {
        // define the color we want to be displayed as the "clipping wall"
        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        // clear the color buffer to show the ClearColor we called above...
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glLoadIdentity();

        myquad.Draw(gl);
        //gl.glTranslatef(.5f, 2.0f, 0.0f);
        //gl.glScalef(.5f, .5f, 0);
    }

private float vertices[] = {
         // Vertices for the square
          -1.0f, -1.0f,  0.0f,  // 0. left-bottom
           1.0f, -1.0f,  0.0f,  // 1. right-bottom
          -1.0f,  1.0f,  0.0f,  // 2. left-top
           1.0f,  1.0f,  0.0f   // 3. right-top
};

private float texture[] = {          
        //Mapping coordinates for the vertices
        0.0f, 1.0f,
        1.0f, 0.0f,
        1.0f, 1.0f,
        0.0f, 1.0f, 
};
public void Draw(GL10 gl)
{   
    // set the color for the triangle
    gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f);

    //Enable the vertex and texture state
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texturebuffer);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexbuffer);

    //gl.glTranslatex(-20, 0, 0);
    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

}

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    现在您的投影设置错误。如果你想像处理像素一样进行绘制,你会想要...... 这条线 gl.glOrthof(0.0f, w, -h, 0.0f, -1.0f, 1.0f); 更像这样 gl.glOrthof(0.0f, width, 0.0f, height, -1.0f, 1.0f); 其中宽度和高度是以像素为单位的上下文大小。

    编辑: gl.glOrthof(0.0f, w, -h, 0.0f, -1.0f, 1.0f); 必须在每次调用 glLoadIdentity() 后调用。 现在你必须调整你的顶点坐标。就目前而言,它们被设置为在屏幕左下角外 1px 处渲染一个 1px x 1px 的框。

    【讨论】:

    • 另外,我在这里可能错了,但您可能还想取消注释掉您对 glMatrixMode 的调用。
    • 好吧,我做了这些更改,它似乎做同样的事情。为什么四边形会占据整个屏幕,我将如何在左上角绘制四边形并使其成为 32X32?
    • 发布最新版本的源代码。
    • 好的,我更新了原始帖子以包含我现在拥有的内容。
    • gl.glOrthof(0.0f, w, 0, h, -1.0f, 1.0f);必须在每个 glLoadIdentity() 之后调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多