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

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 6:
Nós passaremos as coordenadas usando um '''attribute''', assim iremos colocar novos atributos para as cores.
Vamos modificar nossas variáveis globais:
<sourcesyntaxhighlight lang="c">
GLuint vbo_triangle, vbo_triangle_colors;
GLint attribute_coord2d, attribute_v_color;
</syntaxhighlight>
</source>
 
e nosso ''init_resources'':
<sourcesyntaxhighlight lang="c">
GLfloat triangle_colors[] = {
1.0, 1.0, 0.0,
Linha 30:
return 0;
}
</syntaxhighlight>
</source>
 
Agora em nosso <code>onDisplay</code>, nós iremos passar 1(uma) cor RGB para cada 3 vértices. vou escolher amarelo, azul e vermelho, mas fique a vontade para escolher suas cores favoritas :)
<sourcesyntaxhighlight lang="c">
glEnableVertexAttribArray(attribute_v_color);
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle_colors);
Linha 44:
0 // deslocamento do primeiro elemento.
);
</syntaxhighlight>
</source>
 
Vamos chamar o OpenGL apenas para completar o atributo, e terminar nossa função:
<sourcesyntaxhighlight lang="c">
glDisableVertexAttribArray(attribute_v_color);
</syntaxhighlight>
</source>
 
Por ultimo, declararemos isto ao nosso vertex shader:
<sourcesyntaxhighlight lang="glsl">
attribute vec3 v_color;
</syntaxhighlight>
</source>
 
Neste ponto, ao rodarmos o programa, teremos isto:
Linha 81:
 
em triangle.v.glsl:
<sourcesyntaxhighlight lang="glsl">
attribute vec2 coord2d;
attribute vec3 v_color;
Linha 89:
f_color = v_color;
}
</syntaxhighlight>
</source>
 
em triangle.f.glsl:
<sourcesyntaxhighlight lang="glsl">
varying vec3 f_color;
void main(void) {
gl_FragColor = vec4(f_color.x, f_color.y, f_color.z, 1.0);
}
</syntaxhighlight>
</source>
 
(Nota: se estamos usando a GLES2, verifique a seção de portabilidade abaixo.)
Linha 115:
 
Para entender melhor a função ''glVertexAttribPointer'', vamos misturar vários atributos em uma única array(ordenação):
<sourcesyntaxhighlight lang="c">
GLfloat triangle_attributes[] = {
0.0, 0.8, 1.0, 1.0, 0.0,
Linha 124:
glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_attributes), triangle_attributes, GL_STATIC_DRAW);
</syntaxhighlight>
</source>
 
No <code>glVertexAttribPinter</code> o 5 elemento é uma ''stride'', para dizer ao OpenGL quando cada atributo será configurado - em nosso caso 5 floats:
<sourcesyntaxhighlight lang="c">
glEnableVertexAttribArray(attribute_coord2d);
glEnableVertexAttribArray(attribute_v_color);
Linha 147:
(GLvoid*) (2 * sizeof(GLfloat)) // descolocamento do primeiro elemento.
);
</syntaxhighlight>
</source>
 
Ele funciona da mesma forma!
Linha 157:
 
Um alternativa por esporte:
<sourcesyntaxhighlight lang="c">
struct attributes {
GLfloat coord2d[2];
Linha 177:
(GLvoid*) offsetof(struct attributes, v_color) // offset
...
</syntaxhighlight>
</source>
 
Note que usamos <code>offsetof</code> para especificar a primeira cor do offset.
Linha 188:
Vamos dizer que nós queremos definir a transparência global do triângulo pelo código C. tal qual acontece com os attributes, nós precisamos declaro isto.
em uma global no código C:
<sourcesyntaxhighlight lang="c">
GLint uniform_fade;
</syntaxhighlight>
</source>
Depois de declararmos isto no código C (ainda após a linkagem do programa)
<sourcesyntaxhighlight lang="c">
const char* uniform_name;
uniform_name = "fade";
Linha 200:
return 0;
}
</syntaxhighlight>
</source>
 
Note: Poderiamos até atingir um array especifica de elementos no código de shader com <code>uniform_name</code>, e.g. <code>"my_array[1]"</code>!
 
Além disto, para o uniform, nó também definiremos explicitamente o valor da non-varying. Vamos requisitar, em <code>onDisplay</code>, que o triangulo deve ser um pouco opaco:
<sourcesyntaxhighlight lang="c">
glUniform1f(uniform_fade, 0.1);
</syntaxhighlight>
</source>
 
Agora nós podemos usar esta variável em nosso fragment shader:
<sourcesyntaxhighlight lang="glsl">
varying vec3 f_color;
uniform float fade;
Linha 216:
gl_FragColor = vec4(f_color.x, f_color.y, f_color.z, fade);
}
</syntaxhighlight>
</source>
 
Nota: se você não usar uniform em seus código, o <code>glGetUniformLocation</code> não vai enxergar nada, e vai falhar.
Linha 229:
 
Nós podemos especificar a precisão para cada variável.
<sourcesyntaxhighlight lang="glsl">
varying lowp vec3 f_color;
uniform lowp float fade;
</syntaxhighlight>
</source>
 
ou, nós podemos declarar a precisão padrão:
<sourcesyntaxhighlight lang="glsl">
precision lowp float;
varying vec3 f_color;
uniform float fade;
</syntaxhighlight>
</source>
 
Infelizmente os precision hints não funciona no OpenGL 2.1 tradicional, então nós vamos incluir apenas no GLES2.
Linha 248:
 
Nós já pré-especificamos um directiva de processamento para o macro através da função utilitária <code>create_shader</code>:
<sourcesyntaxhighlight lang="glsl">
#define GLES2
</syntaxhighlight>
</source>
 
Agora podemos melhorar nosso carregamento de shader para isto definiremos um precisão padrão no GLES2, e ignoraremos o identificador de precisão no OpenGL 2.1(assim ainda podemos definir um precisão para uma variável especifica se precisarmos):
<sourcesyntaxhighlight lang="cpp">
GLuint res = glCreateShader(type);
const GLchar* sources[] = {
Linha 284:
source };
glShaderSource(res, 3, sources, NULL);
</syntaxhighlight>
</source>
 
Lembrando que o compilador GLSL poderá contar as linhas pré-especificados enquanto mostra mensagens de erro, Ajustando a <code>#line 0</code> infelizmente não reiniciara o contagem de linha do compilador
Linha 299:
No ''main'', vamos declarar a função "idle", depois <code>glutDisplayFunc(...)</code>:
 
<sourcesyntaxhighlight lang="c">
glutIdleFunc(idle);
</syntaxhighlight>
</source>
 
Vamos adicionar a nova função ociosa.
 
<sourcesyntaxhighlight lang="c">
void idle()
{
Linha 313:
glutPostRedisplay();
}
</syntaxhighlight>
</source>
 
também removeremos a chamada para <code>glUniform1f</code> da <code>onDisplay</code>
 
e por ultimo, nós vamos fazer uma declaração de um biblioteca aritmética do C.
<sourcesyntaxhighlight lang="c">
#include <math.h>
</syntaxhighlight>
</source>
no Makefile deixe assim:
LDLIBS=-lglut -lGLEW -lGL '''-lm'''