Programação com OpenGL/Modern OpenGL Tutorial 06: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
[edição verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 56: Linha 56:


== Coordenadas da textura ==
== Coordenadas da textura ==

== Um cubo completo ==

Revisão das 20h19min de 17 de maio de 2013

Carregando uma textura

Nossa textura, em 2D

Para carregar uma textura, nós precisamos de um decoficador para carregar uma imagens, em particular as do tipo JPEG ou PNG. Normalmente, seu programa final usara uma biblioteca generica como o SDL_Image, SFML ou Irrlich, que suportam varios formatos de imagem, assim você não precisa escrever o código da imagem para carrega-lo. Bibliotecas especializadas como o SOIL(veja abaixo) pode ser interessante.

Para o primeiro passo, nós precisamos manipular uma imagem em nível-baixo para entender o basic, assim faremos um truque: O GIMP pode exportar uma imagem para um código fonte C. que poderá estar em nosso programa! Eu usarei a opção de salvamento igual a captura de tela.

Exportando uma imagem como C pelo GIMP

Se tiver demanda, nós podemos providenciar um tutorial especial para leitura de formato simples como o PNM, ou do tipo como BMP ou TGA (este dois também são simples, mas suportam compressão e vários formatos por isto é um pouco difícil suportar todas as suas opções).

Nota: Agregar imagem em código C é muito eficiente em questão de memória, por isto não vamos usar sempre. Tecnicamente: ela é armazenada em um segmento BBS do programa, em vez do heap, por isto não pode ser liberado.

Nota 2: você pode encontrar a fonte do GIMP em res_texture.xcf no repositório de códigos.

Ta compilar automaticamente o aplicativo quando você modificar o res_texture.c, coloque ele no Makefile:

cube.o: res_texture.c

Criando uma textura para o OpenGL buffer

Um buffer é basicamente um espaço na memória da placa de vídeo, assim o OpenGL pode acesa-lo rapidamente.

/* Globais */
GLuint texture_id;
GLint uniform_mytexture;
/* init_resources */
  glGenTextures(1, &texture_id);
  glBindTexture(GL_TEXTURE_2D, texture_id);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, // target
	       0,  // level, 0 = base, sem minimap,
	       GL_RGB, // internalformat (formato interno)
	       res_texture.width,  // largura
	       res_texture.height,  // altura
	       0,  // borda, sempre em 0 no OpenGL ES
	       GL_RGB,  // formato
	       GL_UNSIGNED_BYTE, // tipo
	       res_texture.pixel_data);
/* render */
  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, texture_id);
  glUniform1i(uniform_mytexture, /*GL_TEXTURE*/0);
/* free_resources */
  glDeleteTextures(1, &texture_id);

Coordenadas da textura

Um cubo completo