<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Shader_Program</id>
	<title>LIBGDX Shader Program - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Shader_Program"/>
	<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Shader_Program&amp;action=history"/>
	<updated>2026-10-17T05:49:35Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Shader_Program&amp;diff=593&amp;oldid=prev</id>
		<title>Wiki: Página creada con «&lt;span style=&quot;font-size:150%;&quot;&gt;UNIDADE 2: Creando o mundo&lt;/span&gt;  ===Introdución===  Información: https://github.com/mattdesl/lwjgl-basics/wiki/Shaders   A partires da ver...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Shader_Program&amp;diff=593&amp;oldid=prev"/>
		<updated>2015-12-14T14:31:01Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;span style=&amp;quot;font-size:150%;&amp;quot;&amp;gt;UNIDADE 2: Creando o mundo&amp;lt;/span&amp;gt;  ===Introdución===  Información: https://github.com/mattdesl/lwjgl-basics/wiki/Shaders   A partires da ver...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:150%;&amp;quot;&amp;gt;UNIDADE 2: Creando o mundo&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Introdución===&lt;br /&gt;
&lt;br /&gt;
Información: https://github.com/mattdesl/lwjgl-basics/wiki/Shaders&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partires da versión OPEN GL 2.0 os gráficos renderízanse utilizando Shader´s.&lt;br /&gt;
Os [http://www.opengl.org/wiki/Shader Shader] son programas escritos en linguaxe parecida a C que se denomina  GLSL e que permiten modificar as propiedades dos puntos que se van renderizar podendo facer efectos moi complexos.&lt;br /&gt;
&lt;br /&gt;
O proceso de aplicar un Shader Program a unha figura divídese en dúas etapas:&lt;br /&gt;
&lt;br /&gt;
* Vertex Shader: aplícanse operacións a cada un dos vértices da figura. Por exemplo, poderíamos modificar a posición e tamaño dun obxecto 3D.&lt;br /&gt;
* Fragment Shader: é a segunda etapa. A diferenza coa anterior é que se vai aplicar a cada fragmento da figura. Por simplificar imos identificar fragmento como pixel. Como podedes pensar o custe de GPU será maior que no caso anterior, por lo que non se debe abusar deste mecanismo. Por exemplo, poderíamos cambiar a cor de cada pixel da figura.&lt;br /&gt;
&lt;br /&gt;
===Onde gardar o Program Shader===&lt;br /&gt;
&lt;br /&gt;
O Shader Program pódese definir na propia clase ou ben nun arquivo externo.&lt;br /&gt;
&lt;br /&gt;
====Arquivo externo====&lt;br /&gt;
&lt;br /&gt;
* Temos que gardar o Vertex Shader nun arquivo con extensión .vert (non é obrigatorio).&lt;br /&gt;
* Temos que gardar o Fragment Shader nun arquivo con extensión .frag (non é obrigatorio).&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo sinxelo, no que simplemente asinamos a posición a cada vértice dun triángulo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Crear unha clase de nome UD4_4_ProgramShader, que derive da clase Game e sexa chamada pola clase principal das diferentes versións (desktop, android,...).&lt;br /&gt;
&lt;br /&gt;
Creamos dous arquivos que colocaremos no cartafol assets da versión Android e terán de nome:&lt;br /&gt;
* vertex.vert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec4 a_position;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position = a_position;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Comentarios do código:&lt;br /&gt;
* Liña 4: nesta liña copiamos a posición de cada vértice a un Vec4 interno de ShaderProgram, que será o dato que envía á GPU (Graphics Procesor Unit).&lt;br /&gt;
&lt;br /&gt;
* Liña 1: definimos unha variable de tipo vec4(vector de 4 dimensións). Esta variable é un parámetro onde van chegar cada unha das posicións dos vértices definidos no Mesh. E vos estaredes preguntando, pero as posicións son Vector3(x,y,z) como pode ser que o almacene un Vector4 ? Pois debido a que internamente traballa con matrices de 4x4. O que fai é encher o último número cun 1. &lt;br /&gt;
:Tamén poderíamos poñer: &lt;br /&gt;
::&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec3 a_position;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(a_position,1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* fragment.frag&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
#ifdef GL_ES &lt;br /&gt;
  precision mediump float;&lt;br /&gt;
#endif  &lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
Agora mesmo non fai nada.&lt;br /&gt;
As liñas 1 a 3 define a precisión dos vectores. Sempre se debe de poñer as liñas anteriores xa que esa é a precisión adecuada para traballar con texturas e posicións.&lt;br /&gt;
&lt;br /&gt;
====Definición interna====&lt;br /&gt;
&lt;br /&gt;
Tamén podemos definir o contido dos arquivos en forma de texto dentro do código da clase da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_4_ProgramShader&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Definimos os contidos do Program Shader internamente.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		// create shader program&lt;br /&gt;
		String vertexShader = &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;	gl_Position = &amp;quot; + ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+&amp;quot;}								\n&amp;quot;;&lt;br /&gt;
		String fragmentShader = &amp;quot;#ifdef GL_ES 	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;precision mediump float;		\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;#endif						\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;}							\n&amp;quot;;&lt;br /&gt;
           }  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Comentar no código que podemos facer uso das constantes da clase ShaderProgram para acceder ó nome dos atributos que van recoller os datos enviados polo Mesh de posición, cor e textura.&lt;br /&gt;
No exemplo anterior, poñer:&lt;br /&gt;
:: &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot; &lt;br /&gt;
é equivalente a poñer:&lt;br /&gt;
:: &amp;quot;attribute vec4 a_position;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Funcionamento do ShaderProgram===&lt;br /&gt;
&lt;br /&gt;
Unha vez decido onde vai ir o código analizaremos o funcionamento dos Shader´s.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; A partires de aquí usaremos a opción de gardar o arquivo de forma externa en dous arquivos.&lt;br /&gt;
&lt;br /&gt;
Como dixemos anteriormente o proceso de aplicar un shader consta de dous pasos. &lt;br /&gt;
Nun primeiro paso se aplican transformacións ós vértices da figura e nun segundo paso se aplican transformacións a fragmentos (pixeles) da figura.&lt;br /&gt;
&lt;br /&gt;
====Traballando coa posición====&lt;br /&gt;
Inicialmente nos temos que pasarlle ó programa información como pode ser a posición de cada vértice. &lt;br /&gt;
Para pasarlle información usaremos a liña:&lt;br /&gt;
::&amp;#039;&amp;#039;&amp;#039;attribute vec4 a_position;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Coa palabra clave atribute estamos a definir un parámetro. Este parámetro (o da posición) ten un nome xa predefinido e un tipo (Vector4).&lt;br /&gt;
&lt;br /&gt;
Cando definimos o Mesh da forma:&lt;br /&gt;
&lt;br /&gt;
::trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position());&lt;br /&gt;
&lt;br /&gt;
Estamos a dicir que imos enviar como datos a información da posición ó parámetro a_position definido no programa vertex.vert.&lt;br /&gt;
&lt;br /&gt;
O código completo:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_4_ProgramShader&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Ver como funciona o Shader Program.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 *  Funcionamento do ShaderProgram&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_4_ProgramShader extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private OrthographicCamera camara2d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, 0f,&lt;br /&gt;
				0.5f, -0.5f, 0f,&lt;br /&gt;
				0f, 0.5f, 0f, &lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(1f, 1f, 1f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos consultar [http://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations neste enlace] as operacións que podemos facer sobre os tipos de datos da linguaxe GLSL (coa que definimos o Program Shader).&lt;br /&gt;
&lt;br /&gt;
Por exemplo, podemos facer que o triángulo se estreita desta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec3 a_position;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  vec4 v = vec4(a_position,1);&lt;br /&gt;
  v.x = v.x/4;&lt;br /&gt;
  gl_Position = v; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TAREFA 4.3 A FACER:&amp;#039;&amp;#039;&amp;#039; Esta parte está asociada á realización dunha tarefa.  &lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====Traballando coa cor====&lt;br /&gt;
&lt;br /&gt;
O proceso para traballar coa cor é o mesmo que no caso da posición.&lt;br /&gt;
&lt;br /&gt;
A nome do parámetro a definir no arquivo vertex.vert é &amp;#039;&amp;#039;&amp;#039;a_color&amp;#039;&amp;#039;&amp;#039; ou se estamos a definir o Program Shader internamente poderíamos utilizar a constante:  &amp;#039;&amp;#039;&amp;#039;ShaderProgram.COLOR_ATTRIBUTE&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec4 a_color;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Fixarxe como a cor é un vector4 xa que enviamos RGBA.&lt;br /&gt;
&lt;br /&gt;
O parámetro temos que definilo no vertex.vert pero o valor da cor non se vai utilizar neste arquivo se non que ten que pasarse ó Fragment Shader.&lt;br /&gt;
&lt;br /&gt;
Para pasalo temos que definir unha variable de tipo [http://zach.in.tu-clausthal.de/teaching/cg_literatur/glsl_tutorial/#varying varying]. O que facemos é pasarlle o valor (a cor) ó parámetro a_color, despois gardaremos dito valor na variable de tipo varying v_color e dende o Fragment Program (o arquivo fragment.frag) podemos acceder a dito valor.&lt;br /&gt;
&lt;br /&gt;
* Arquivo vertex.vert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;2,3,7&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec3 a_position;&lt;br /&gt;
attribute vec4 a_color;&lt;br /&gt;
varying vec4 v_color;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position =  vec4(a_position,1);&lt;br /&gt;
  v_color = a_color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Agora modificaremos o arquivo fragment.frag e recoller o dato e pasalo á variable &amp;#039;&amp;#039;&amp;#039;gl_FragColor&amp;#039;&amp;#039;&amp;#039;, que é o que se vai pasar á GPU.&lt;br /&gt;
&lt;br /&gt;
* Arquivo fragment.frag&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4,7&amp;quot; &amp;gt;&lt;br /&gt;
#ifdef GL_ES &lt;br /&gt;
  precision mediump float;&lt;br /&gt;
#endif  &lt;br /&gt;
varying vec4 v_color;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_FragColor = v_color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por último modificamos o Mesh para enviarlle os datos da cor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;33-38&amp;quot; &amp;gt;&lt;br /&gt;
package com.plategaxogo3d.exemplos;&lt;br /&gt;
&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Funcionamento do ShaderProgram&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_4_ProgramShader extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private OrthographicCamera camara2d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f,&lt;br /&gt;
				0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f,&lt;br /&gt;
				0f, 0.5f, 0f, 1f, 0f, 0f, 1f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Traballando coa textura====&lt;br /&gt;
&lt;br /&gt;
Xa vimos [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Figuras_3D_Mesh#Texturas anteriormente] como asociar unha textura a un Mesh.&lt;br /&gt;
&lt;br /&gt;
Imos explicar un pouco en profundidade o proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Deberemos copiar o arquivo seguinte ó cartafol assets do proxecto Android. Se o proxecto está xerado coa [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Instalaci%C3%B3n_do_framework_LIBGDX ferramenta de Libgdx] xa deberedes ter este gráfico.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:Badlogic.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
O proceso é moi parecido a como fixemos coa cor, pero cunhas pequenas diferenzas.&lt;br /&gt;
&lt;br /&gt;
O código do Mesh será o seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(),VertexAttribute.TexCoords(0));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta liña indica que imos enviar os datos da textura, cun identificador de 0 (TexCoords&amp;#039;&amp;#039;&amp;#039;(0)&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Ese 0 vai pasarse como parámetro ó programa do vertex.vert, na variable a_texCoord&amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Polo tanto, teremos que poñer algo como isto:&lt;br /&gt;
&lt;br /&gt;
* Programa vertex.vert&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;3,5,10&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec3 a_position;&lt;br /&gt;
attribute vec4 a_color;&lt;br /&gt;
attribute vec2 a_texCoord0;&lt;br /&gt;
varying vec4 v_color;&lt;br /&gt;
varying vec2 v_textCoord;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position =  vec4(a_position,1);&lt;br /&gt;
  v_color = a_color;&lt;br /&gt;
  v_textCoord = a_texCoord0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Liña 3: Fixarse como as coordenadas da textura é un Vector2.&lt;br /&gt;
* Liña 5: Definimos unha variable de tipo varying para pasarlle o valor ó programa Fragment (fragment.frag).&lt;br /&gt;
* Liña 10: Gardamos o valor na variable v_textCoord.&lt;br /&gt;
&lt;br /&gt;
Ata aquí o código da clase UD4_4_ProgramShader é o seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_4_ProgramShader&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Debuxar unha textura utilizando un ShaderProgram.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
public class UD4_4_ProgramShader extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private Texture textura;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(),VertexAttribute.TexCoords(0));&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 0f, 1f,&lt;br /&gt;
				0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 1f, 1f,&lt;br /&gt;
				0f, 0.5f, 0f, 1f, 0f, 0f, 1f, 0.5f,0f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		FileHandle imageFileHandle = Gdx.files.internal(&amp;quot;badlogic.jpg&amp;quot;);&lt;br /&gt;
		textura = new Texture(imageFileHandle);&lt;br /&gt;
	}&lt;br /&gt;
        ...............&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Imos analizar agora a parte render desta clase.&lt;br /&gt;
&lt;br /&gt;
Para asociar unha textura a un obxecto temos que chamar ó método bind da textura. Ó facelo, indicamos un número que vai indicar á qué número de textura de OPEN GL vai asociarse. Por defecto é 0 (se non podemos nada).&lt;br /&gt;
&lt;br /&gt;
O código sería este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	textura.bind(0);		&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Agora temos que buscar a maneira de &amp;#039;pasarlle&amp;#039; esta textura o programa Fragment, xa que é aquí onde asignamos a cor e a textura.&lt;br /&gt;
A idea é que colla punto a punto (en texturas falamos de fragmentos) da textura e a debuxe no sitio que lle corresponda de acordo á posición indicada na figura.&lt;br /&gt;
&lt;br /&gt;
Como facendo o bind xa estamos a cargar a textura en OPEN GL ES, imos a enviarlle o programa o índice utilizado, para que dende o programa Fragment accede a dita textura.&lt;br /&gt;
&lt;br /&gt;
A forma de pasarlle o índice é así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;2&amp;quot; &amp;gt;&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformi(&amp;quot;u_texture&amp;quot;, 0);&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 2: pasamos á variable u_texture ó valor 0 que se corresponde co índice empregado na textura con bind.&lt;br /&gt;
&lt;br /&gt;
Agora modificamos o programa vertex.vert para que recolla o índice e acceda á textura:&lt;br /&gt;
&lt;br /&gt;
* Programa fragment.frag&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;6,9&amp;quot; &amp;gt;&lt;br /&gt;
#ifdef GL_ES &lt;br /&gt;
  precision mediump float;&lt;br /&gt;
#endif  &lt;br /&gt;
varying vec4 v_color;&lt;br /&gt;
varying vec2 v_textCoord;&lt;br /&gt;
uniform sampler2D u_texture;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  vec4 texColor = texture2D(u_texture, v_textCoord);&lt;br /&gt;
  gl_FragColor = v_color*texColor;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 6: O índice é utilizado para acceder á textura correspondente (sampler2D é un tipo de dato co que accedemos á textura).&lt;br /&gt;
* Liña 9: Accedemos a un punto da textura.&lt;br /&gt;
* Liña 10: Mandamos a textura a debuxar. Multiplicamos pola cor para tintar a textura. Se non queremos que a cor teña efecto sobre a textura podemos quitar v_color da multiplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código completo da clase:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_4_ProgramShader&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Mandar unha textura ó ShaderProgram&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.files.FileHandle;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.Texture;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Funcionamento do ShaderProgram&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_4_ProgramShader extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private Texture textura;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(),VertexAttribute.TexCoords(0));&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 0f, 1f,&lt;br /&gt;
				0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 1f, 1f,&lt;br /&gt;
				0f, 0.5f, 0f, 1f, 0f, 0f, 1f, 0.5f,0f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		FileHandle imageFileHandle = Gdx.files.internal(&amp;quot;badlogic.jpg&amp;quot;);&lt;br /&gt;
		textura = new Texture(imageFileHandle);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		&lt;br /&gt;
		textura.bind(0);		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformi(&amp;quot;u_texture&amp;quot;, 0);&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Traballando coa cámara====&lt;br /&gt;
&lt;br /&gt;
Como último paso temos que pasarlle a matriz da cámara para que axuste cada punto da figura e os visualice no lugar correcto en función da cámara.&lt;br /&gt;
&lt;br /&gt;
Lembrar que [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D#PerspectiveCamera cando vimos as cámaras] comentamos que para posicionar correctamente os puntos, usamos as matrices de proxección e modelado. Unha matriz servía para definir os planos far, near e viewportwidth /  viewportheight (a matriz de proxección) e a outra matriz (modelado) servía para mover a cámara, rotala,...non é que servira para iso, quero dicir que cando movemos a cámara para unha posición, todos as figuras da nosa escena se teñen que debuxar de acordo á posición da cámara.&lt;br /&gt;
&lt;br /&gt;
Polo tanto é necesario enviarlle as dúas matrices ó programa Vertex.vert, xa que é aquí onde posicionamos os puntos da nosa figura.&lt;br /&gt;
&lt;br /&gt;
Lembrar que a matriz de proxección e modelado se combinan para dar a matriz combinada a cal temos acceso a través de [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Camera.html#combined método combined] das cámaras.&lt;br /&gt;
&lt;br /&gt;
Como pasamos dita matriz ó programa Vertex.vert ?&lt;br /&gt;
&lt;br /&gt;
* Programa vertex.vert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;6,9&amp;quot; &amp;gt;&lt;br /&gt;
attribute vec3 a_position;&lt;br /&gt;
attribute vec4 a_color;&lt;br /&gt;
attribute vec2 a_texCoord0;&lt;br /&gt;
varying vec4 v_color;&lt;br /&gt;
varying vec2 v_textCoord;&lt;br /&gt;
uniform mat4 u_worldView;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position =  u_worldView *vec4(a_position,1);&lt;br /&gt;
  v_color = a_color;&lt;br /&gt;
  v_textCoord = a_texCoord0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 6: definimos a matriz de 4x4 como de tipo uniform (vaise pasar como parámetro dende a clase).&lt;br /&gt;
* Liña 9: multiplicamos a posición da figura Mesh pola matriz da cámara.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;b&amp;gt;IMPORTANTE:&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt; Hai que ter ven claro que as figuras en 3D se debuxan todas no punto (0,0,0).&lt;br /&gt;
A partires dese punto se moven de acordo a súa posición (o veremos no seguinte punto) e unha vez movidas se aplica a cámara para sacar unha &amp;#039;foto&amp;#039; do que se ve. Lembrar que todos son operacións matemáticas feitas con matrices.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_4_ProgramShader&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Aplicar a matriz combinada dunha cámara ó Shader Program.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;22,45,59,73-83&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.files.FileHandle;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.PerspectiveCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.Texture;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Funcionamento do ShaderProgram&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_4_ProgramShader extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private Texture textura;&lt;br /&gt;
	private PerspectiveCamera camara3d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(),VertexAttribute.TexCoords(0));&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 0f, 1f,&lt;br /&gt;
				0.5f, -0.5f, 0f, 1f, 0f, 0f, 1f, 1f, 1f,&lt;br /&gt;
				0f, 0.5f, 0f, 1f, 0f, 0f, 1f, 0.5f,0f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		FileHandle imageFileHandle = Gdx.files.internal(&amp;quot;badlogic.jpg&amp;quot;);&lt;br /&gt;
		textura = new Texture(imageFileHandle);&lt;br /&gt;
		&lt;br /&gt;
		camara3d = new PerspectiveCamera();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara3d.combined);&lt;br /&gt;
		&lt;br /&gt;
		textura.bind(0);		&lt;br /&gt;
		shaderProgram.setUniformi(&amp;quot;u_texture&amp;quot;, 0);&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		float aspectRatio = (float) width / (float) height; &lt;br /&gt;
		camara3d.viewportWidth = 1f*aspectRatio;&lt;br /&gt;
		camara3d.viewportHeight = 1f;&lt;br /&gt;
		camara3d.far=1000f;&lt;br /&gt;
		camara3d.near=0.1f;&lt;br /&gt;
		camara3d.lookAt(0,0,0);&lt;br /&gt;
		camara3d.position.set(0f,0f,3f);&lt;br /&gt;
		camara3d.update();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 22: Definimos a cámara.&lt;br /&gt;
* Liña 45: Instanciamos o obxecto.&lt;br /&gt;
* Liñas 73-83: Actualizamos os valores da cámara. Importante chamar ó método update.&lt;br /&gt;
* Liña 82: Mandamos a matriz ó programa vertex.vert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TAREFA 4.4 A FACER:&amp;#039;&amp;#039;&amp;#039; Esta parte está asociada á realización dunha tarefa.  &lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2015).&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
		
	</entry>
</feed>