Установка структур OpenGL ES 2.0

Я работаю над проектом iPhone в XCode 3.2.4, для которого я хотел бы отобразить структуры с помощью OpenGL ES 2.0. У меня нет большого предыдущего опыта, работающего с OpenGL, но до сих пор это не кажется слишком ужасным. До сих пор я главным образом обращался к руководству по программированию OpenGL ES 2.0 (золотая книга).

Прямо сейчас у меня есть проект на основе шаблона OpenGL XCode по умолчанию с функцией drawFrame, замененной моим отображающим структуру кодом, который в свою очередь основан на проекте Simple_Texture2D из золотой книги. Однако квадрат, на который я должен тянуть свою структуру, не отображает ее; это черно вместо этого, и я не уверен, почему это происходит.

Вот содержание drawFrame:

[(EAGLView *)self.view setFramebuffer];

GLuint textureID;

static const GLfloat squareVertices[] =
{
    -0.5f, -0.33f,
    0.5f, -0.33f,
    -0.5f,  0.33f,
    0.5f,  0.33f
};

// Generate a 2 x 2 rgb image at 3 bytes per pixel.
GLubyte image[4 * 3] =
{
    255,   0,   0,
    0,   255,   0,
    0,     0, 255,
    255, 255,   0
};

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(program);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glGenTextures(1, &textureID);

glBindTexture(GL_TEXTURE_2D, textureID);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

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

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

[(EAGLView *)self.view presentFramebuffer];

Возможно, опытному пользователю OpenGL будет очевидно, что я делаю неправильно. Иначе любые предложения, предположения или конструктивные комментарии любого вида являются большими также.

Заранее спасибо!

1
задан Boeronzes 14 August 2010 в 08:25
поделиться

1 ответ

Вам нужны не только позиции вершин, но и координаты текстуры. В настоящее время вы указываете только позиции вершин, поэтому вы собираетесь только вершины с тем цветом, который был установлен последним, без текстуры.

Попробуйте создать массив texCoord и выполнить еще один glVertexAttribPointer (ATTRIB_TEXCOORD, ...) и glEnableVertexArray (ATTRIB_TEXCOORD) .

(Если вы освещаете, вам также могут понадобиться нормали.)

Там пример кода на странице OpenGL Vertex Array Сонгхо (раздел glDrawElements). См. Функцию draw3 и предыдущую настройку.

Обратите внимание, что объекты буфера вершин (и другие объекты буфера) обычно заменяют массивы вершин (и другие массивы) в качестве предпочтительного решения для одновременной визуализации пакетов данных. VBO имеют больше возможностей для высокопроизводительного сохранения драйвером.

2
ответ дан 2 September 2019 в 22:09
поделиться