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

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Criou nova página com '== Atributos: Passando informações adicionais de vértices =='
 
Linha 1:
== Atributos: Passando informações adicionais de vértices ==
 
Podemos precisar de mais algumas coordenadas para nosso programa. Por exemplo: cores.
Vamos passar cores RGB para o OpenGL.
 
Nós passaremos as coordenadas usando um '''atributo''', assim vamos adicionar novos atributos para as cores.
Vamos modificar nossas variáveis globais:
<source lang="c">
GLuint vbo_triangle, vbo_triangle_colors;
GLint attribute_coord2d, attribute_v_color;
</source>
 
e nosso ''init_resources'':
<source lang="c">
GLfloat triangle_colors[] = {
1.0, 1.0, 0.0,
0.0, 0.0, 1.0,
1.0, 0.0, 0.0,
};
glGenBuffers(1, &vbo_triangle_colors);
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle_colors);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_colors), triangle_colors, GL_STATIC_DRAW);
 
[...]
 
attribute_name = "v_color";
attribute_v_color = glGetAttribLocation(program, attribute_name);
if (attribute_v_color == -1) {
fprintf(stderr, "Could not bind attribute %s\n", attribute_name);
return 0;
}
</source>
 
Agora em nosso <code>onDisplay</code>, nós vamos passar 1 cor RGB para cada 3 vértices. Eu escolhi amarelo, azul e vermelho, mas fique a vontade para escolher suas cores favoritas :)
<source lang="c">
glEnableVertexAttribArray(attribute_v_color);
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle_colors);
glVertexAttribPointer(
attribute_v_color, // atributos
3, // numero de elemenos por vérice, aqui é (r,g,b)
GL_FLOAT, // o tipo de cada elementos
GL_FALSE, // estado dos nossos valores.
0, // sem dados extras em cada posição.
0 // deslocamento do primeiro elemento.
);
</source>
 
Vamos chamar o OpenGL apenas para completar o atributo, e terminar nossa função:
<source lang="c">
glDisableVertexAttribArray(attribute_v_color);
</source>
 
Por ultimo, nós declaremos isto em nosso vertex shader:
<source lang="glsl">
attribute vec3 v_color;
</source>
 
Neste ponto, se nós rodarmos o programa, teremos isto:
 
Could not bind attribute v_color
 
Isto acontece porque não usamos o v_color ainda. <ref> É um pouco confuso tendo apenas um único exemplo nos diferentes conceitos de atributos e variantes.
Vamos tentar procurar dois exemplos separados para uma melhor explicação.</ref>
 
O Problema é: queremos cor no fragment shader, não no vertex shader!
Vamos ver agora como fazer...