Как примечание: шаблон 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, вы должны использовать вышеуказанное в качестве основы для этого.