Подтвердить что ты не робот

OpenGL ES 2.0 рендеринг с текстурой

В iPhone SDK есть пример использования ES 2.0 с набором шейдеров GLSL (Vertex и Fragment) для рендеринга цветного окна. Есть ли пример, как сделать простую текстуру с помощью этого API? Я в основном хочу взять квад, и нарисую на нем текстуру.

Старый API ES 1.1 больше не работает, поэтому мне нужно немного начать работу. Большинство ссылок на шейдеры в основном говорят о расширенных темх затенения, но я действительно не уверен, как сказать шейдеру использовать связанную текстуру и как ссылаться на UV.

Спасибо!

4b9b3361

Ответ 1

Там есть хороший учебник по этому вопросу на веб-сайте, чтобы перейти к книге OpenGL ES 2 Примеры из книги - все в www.opengles-book.com.

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

Программа шейдера близка к:

varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main() {
  gl_FragColor = texture2D(s_texture, v_texCoord);
}

и вы установите его таким образом:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, userData->textureId);
// Set the sampler texture unit to 0
glUniform1i(userData->samplerLoc, 0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

Но посмотрите фактический код из ссылок, приведенных выше, чтобы действительно увидеть пример.

Ответ 2

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


Настройка (сразу после выполнения glVertexAttribPointer для массивов вершин)

GLint program; // your shader-program, pre-filled

...

// AFTER you've created *and set* the EAGLContext
GLKTextureInfo* appleTexture = [GLKTextureLoader
         textureWithContentsOfFile:... options:... error:...];
// NB: make sure that the returned texture is not nil!
// if it nil, you'll get black objects, and need to check
// your path to your texture file

...

// INSIDE your VAO setup (usually "setupGL" in Apple template),
// assuming you're using VAO,
// i.e. after "glBindVertexArrayOES"
GLint _textureBuffer; // an empty buffer that we'll create and fill
glEnableVertexAttribArray( glGetAttribLocation(program, "a_textureCoordinate") );
glGenBuffers(1, &_textureBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _textureBuffer);
glBufferData(GL_ARRAY_BUFFER, 
        self.currentScene.meshNumVertices * sizeof( (*self->sharedMeshTextureCoords) ),
        self->sharedMeshTextureCoords, GL_DYNAMIC_DRAW);
glVertexAttribPointer( glGetAttribLocation(program, "a_textureCoordinate"),
        2, GL_FLOAT, GL_FALSE, 0, 0);

glActiveTexture(GL_TEXTURE0);

Render (последняя вещь перед вызовом glDrawArrays или аналогичная)

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [appleTexture name]);
glUniform1i( glGetUniformLocation( program, "s_texture"), 0); // No idea

Шейдер текстуры:

attribute vec4 position;
attribute vec2 a_textureCoordinate;

varying vec2 v_textureCoordinate;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    v_textureCoordinate = a_textureCoordinate;
    gl_Position = modelViewProjectionMatrix * position;
}

Фрагментный шейдер:

uniform sampler2D s_texture;
varying mediump vec2 v_textureCoordinate;

void main(void)
{
    gl_FragColor = texture2D( s_texture, v_textureCoordinate );
}

Ответ 3

К сожалению, OpenGL ES 2.0 использует дочернюю версию GLSL с красным голосом, 1.4. Большинство публикаций по учебникам не работают в этой версии. Все вспомогательные переменные, такие как ftransform и gl_TexCoord [0], были удалены. Найти конкретные учебники по ES 2.0, которые идут дальше, чем просто чистые основы, трудно.

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

Я знаю, что вы опубликовали несколько месяцев назад, но если кто-то все еще ищет информацию, выполните поиск на opengl.org для всего, что связано с OpenGL 3.0. Было несколько хороших исходных выпусков, которые являются полуприменимыми. На форумах есть также очень хороший источник информации.

Ответ 4

Я поместил кучу руководств Nehe в OpenGLES2.0 - доступный здесь. Вот пример обработки текстур в учебнике 6.