首页 > 解决方案 > 使用 OpenGL ES glDrawElements 绘制正方形不起作用

问题描述

我正在尝试使用以下代码在 Android 上绘制一个正方形:

void drawSquare()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    GLfloat vertices[] =
    {
        -0.5f, -0.5f,
        0.5f, -0.5f,
        0.5f, 0.5f,
        -0.5f, 0.5f
    };

    GLubyte indices[] = { 0, 1, 2, 3 };

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_BYTE, indices);
}

之前,我调用上述方法设置显示,如下所示:

bool initDisplay()
{
    const EGLint attribs[] =
    {
        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
        EGL_BLUE_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_RED_SIZE, 8,
        EGL_NONE
    };

    EGLint format;
    EGLint numConfigs;
    EGLConfig config;

    EGLDisplay mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    eglInitialize(mDisplay, 0, 0);
    eglChooseConfig(mDisplay, attribs, &config, 1, &numConfigs);
    eglGetConfigAttrib(mDisplay, config, EGL_NATIVE_VISUAL_ID, &format);
    ANativeWindow_setBuffersGeometry(mApp->window, 0, 0, format);

    EGLSurface mSurface = eglCreateWindowSurface(mDisplay, config, mApp->window, NULL);
    EGLContext mContext = eglCreateContext(mDisplay, config, NULL, NULL);

    eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
    eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mWidth);
    eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight);

    return true;
}

并像这样设置OpenGL:

bool initGL()
{
    glDisable(GL_DITHER);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
    glClearColor(0.f, 0.f, 0.f, 1.0f);
    glShadeModel(GL_SMOOTH);

    glViewport(0, 0, mWidth, mHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    return true;
}

但是,我看不到屏幕上的正方形。只看到黑屏。在此先感谢您的帮助。

标签: c++opengl-esegl

解决方案


指数

GLubyte indices[] = { 0, 1, 2, 3 };

不要指定三角形Primitive。指定一个四边形。GL_QUADS分别使用原始类型GL_TRIANGLE_FAN

GLubyte indices[] = { 0, 1, 2, 3 };

glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices);

或由 2 个具有索引 (0 - 1 - 2) 和 (0 - 2 - 3) 的三角形组成正方形:

3           2
 +------+  +
 |     / / |
 |   / /   |
 | / /     |
 + +-------+
0           1
GLubyte indices[] = { 0, 1, 2, 0, 2, 3 };

glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

推荐阅读