2010-05-05 16 views
14

El SDK de iPhone tiene un ejemplo del uso de ES 2.0 con un conjunto de sombreadores GLSL (Vértice &) para generar una caja de colores variable. ¿Hay algún ejemplo sobre cómo renderizar una textura simple usando esta API? Básicamente quiero tomar un quad y dibujar una textura sobre él.Representación de OpenGL ES 2.0 con una textura

Las antiguas API de ES 1.1 ya no funcionan, por lo que necesito un poco de ayuda para comenzar. La mayoría de las referencias de sombreadores se refieren principalmente a temas avanzados de sombreado, pero realmente no estoy seguro de cómo decirle al sombreador que utilice la textura encuadernada y cómo hacer referencia a los rayos ultravioleta.

Gracias!

+0

¿Qué quiere decir con "la vieja ES 1.1 del API ya no funcionan", estoy usando GL ES 1.1 y funciona perfectamente. – Goles

+0

Lo que mencioné, no puede simplemente lanzar llamadas de función de ES 1.1 a un contexto inicializado de ES 2.0 ... Claro que puede inicializar ES 1.1 y usar eso, pero no podrá hacer uso de sombreadores – Kyle

Respuesta

15

Hay un buen tutorial sobre esto en el sitio web para ir con el libro OpenGL ES 2 Los ejemplos del libro están todos en www.opengles-book.com.

Capítulo 9, Simple_Texture2D hace exactamente lo que desea. Configura un sombreador que muestrea una textura, la inicializa y sombrea los triángulos usando la textura.

El programa de sombreado está cerca de:

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

y lo configura de esta manera:

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); 

Pero ver el código real, a partir de los enlaces que di arriba, para ver realmente el ejemplo .

+1

Esto es solo una media respuesta. Debes explicar qué es userData, etc. Vine aquí porque ya tengo ese libro, y los autores se dan por vencidos cuando llegan al capítulo sobre texturas; la calidad del código en el libro cae en picado, las explicaciones se vuelven breves y anticuadas (centrándose en GL 1 en lugar de GL 2, etc.). En última instancia, te ves obligado a tirar el libro a la basura, descargar el código fuente de Internet y tratar de resolverlo sin la ayuda de los autores. Eso no es de ayuda cuando estás navegando en un ipad :(. – Adam

+0

cf mi respuesta a continuación, finalmente descubrí todas las piezas faltantes. Sigue el código completo ... – Adam

+2

"glEnableVertexAttribArray (0); glEnableVertexAttribArray (1);" Cualquier libro que usa números codificados para esto en lugar de almacenarlos en una variable (asignada por ogl) es un libro del que me mantendría alejado. Quién sabe qué tipo de cosas malas están tratando de enseñar. – Kevin

5

Desafortunadamente, OpenGL ES 2.0 usa la versión hipersustentadora roja de GLSL, versión 1.4. La mayoría de los tutoriales que las personas publican no funcionan en esta versión. Se han eliminado todas las variables auxiliares, como ftransform y gl_TexCoord [0]. Es difícil encontrar tutoriales específicos de ES 2.0 que vayan más allá de lo básico puro.

OpenGL ES 2.0 es una tubería completamente programable, han eliminado cualquier función fija. Si desea usarlo, deberá proporcionar sus propias matrices para realizar un seguimiento de lo que solía ser la vista de modelo y las matrices de proyección.

Sé que publicó hace unos meses, pero si alguien aún está buscando información, haga una búsqueda en opengl.org para cualquier cosa relacionada con OpenGL 3.0. Hubo una serie de buenas versiones de fuente que son semi aplicables. Los foros allí también son una muy buena fuente de información.

2

He portado un montón de los tutoriales de Nehe a OpenGLES2.0 - disponible here. Hay un ejemplo de representación de texturas en el tutorial 6.

+0

Wow, tus tutoriales son ¡agradable, limpiamente codificado, y sobre todo, funcionan! – bobobobo

+0

El enlace no funciona, parece spam – Campino

+0

Se corrigió el enlace - el blog antiguo debe ser decomisionado – Chris

7

Aquí está la versión más simple que podría hacer que efectivamente trabajadas:


de configuración (inmediatamente después de haber realizado la glVertexAttribPointer para sus vertex arrays)

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); 

Render (última cosa antes de llamar a glDrawArrays o similar)

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

textura shader:

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; 
} 

Fragmento de sombreado:

uniform sampler2D s_texture; 
varying mediump vec2 v_textureCoordinate; 

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