Как изменить шаблон iOS OpenGL ES 2.0 по умолчанию для отображения текстуры? - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь изучить некоторые базовые OpenGL ES для разработки на iPhone, и у меня есть задача, которую я не могу заставить работать.

Я не могу изменить шаблон OpenGL ES по умолчанию для отображения текстуры на прыгающем квадрате вместо радужного эффекта по умолчанию. Я пытаюсь использовать текстуру для этого квадрата, но пока квадрат просто показывает черный. Что я могу делать не так в этом простом случае, и как я могу изменить код базового шаблона для отображения моей текстуры?

1 Ответ

2 голосов
/ 25 октября 2011

Как примечание: шаблон OpenGL ES по умолчанию изменился для iOS 5.0 SDK, и теперь он использует GLKit для рисования вращающихся кубов, поэтому я не смог создать простой тестовый проект, основанный на том оригинальном радуге, что они

Вместо этого вы можете посмотреть образец приложения , который я подготовил для своего класса по этому вопросу.Это довольно урезанное приложение, которое отображает текстуры на гранях вращающегося куба.Я подробно описываю, как это работает в видео для этого класса в iTunes U .

. В этом примере приложения используется класс Apple PVRTexture (из одного из их других примеров приложений) для загрузки в PVRTC.сжатый файл текстуры (который более эффективен по памяти, чем обычные изображения).Основной код для настройки текстуры:

glGenTextures(1, &_name);
glBindTexture(GL_TEXTURE_2D, _name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glCompressedTexImage2D(GL_TEXTURE_2D, i, _internalFormat, width, height, 0, [data length], [data bytes]);

, где _name - это идентификатор, который вы позже будете использовать для привязки этой текстуры.Вы бы использовали glTexImage2D() вместо последней функции, если работали с обычной несжатой текстурой.

Затем можно включить использование текстур:

glEnable(GL_TEXTURE_2D);

и связать текстурудля отображения с использованием идентификатора, который вы получили при создании текстуры:

glBindTexture(GL_TEXTURE_2D, pvrTexture.name);

По умолчанию эта текстура привязана к единице текстуры 0, но вы можете переключиться на другую единицу, используя glActiveTexture(GL_TEXTURE1) или т.п..

Затем вам нужно передать эту текстуру в вашу шейдерную программу как униформу, со вторым параметром, являющимся единицей текстуры, с которой связана текстура:

glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

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

const GLfloat cubeTexCoords[] = {
    1.0, 0.0,
    0.0, 0.0,
    1.0, 1.0,
    0.0, 1.0,
    0.0, 0.0,
    1.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 1.0,
    0.0, 1.0,
    0.0, 0.0,
    1.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
};

, и эти координаты будут введены в вашу программу шейдера в виде атрибута:

glVertexAttribPointer(ATTRIB_TEXTUREPOSITION, 2, GL_FLOAT, 0, 0, cubeTexCoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITION);

Ваша шейдерная программа должна быть в состоянии воспринимать форму текстуры и ее координаты, поэтому в вашем вершинном шейдере вы увидите нечто похожее:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

uniform mat4 modelViewProjMatrix;

void main()
{
    gl_Position = modelViewProjMatrix * position;
    textureCoordinate = inputTextureCoordinate.xy;
}

и это для соответствующего фрагментного шейдера:

varying highp vec2 textureCoordinate;

uniform sampler2D texture;

void main()
{
    gl_FragColor = texture2D(texture, textureCoordinate);
}

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

При компиляции этого шейдера вам нужно будет сопоставлять атрибуты и униформу, но шаблон OpenGL ES 2.0 должен показать, как это сделать.

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

...