OpenGL ES 2.0 рендеринг с текстурой - PullRequest
14 голосов
/ 05 мая 2010

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

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

Спасибо!

Ответы [ 5 ]

15 голосов
/ 20 октября 2010

На этом веб-сайте есть хороший учебник, в котором можно найти книгу 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);

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

7 голосов
/ 30 декабря 2012

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


Настройка (сразу после того, как вы сделали 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's nil, you'll get black objects, and need to check
// your path to your texture file

...

// INSIDE your VAO setup (usually "setupGL" in Apple's 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);

Визуализация (последняя вещь перед вызовом 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 );
}
5 голосов
/ 31 августа 2010

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

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

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

2 голосов
/ 14 апреля 2011

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

0 голосов
/ 08 мая 2010

Вы пробовали "нормальный" учебник OpenGL, такой как этот учебник от Lighthouse3D или этот учебник от часовых кодеров ? Это также должно работать для OpenGL ES.

...