Рисование квадрата с помощью OpenGL ES glDrawElements не работает - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь нарисовать квадрат на 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;
}

Однако я не вижу квадрата на экране.Просто посмотрите на черный экран.Заранее спасибо за помощь.

1 Ответ

1 голос
/ 25 сентября 2019

Индексы

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

не указывают треугольник Примитив .Укажите четырехугольник.Используйте тип примитива 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);
...