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

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
m Foram revertidas as edições de 2804:56C:CBC1:4400:B97F:61E6:EF8C:9CED (disc) para a última revisão de TurkEngineer
Etiqueta: Reversão
m <source> -> <syntaxhighlight> (phab:T237267)
Linha 81:
 
Vamos criar um arquivo chamado triangle.c:
<sourcesyntaxhighlight lang="c">
/* Usando o padrão de saída fprintf */
#include <stdio.h>
Linha 138:
return EXIT_SUCCESS;
}
</syntaxhighlight>
</source>
 
Na função <code>init_resources</code>, nós criaremos nosso programa GLSL. Na função <code>onDisplay</code>, nós desenharemos o triangulo. Na função <code>free_resources</code>, destruiremos nosso programa GLSL.
Linha 147:
Nos descreveremos o triângulo com coordenadas 2D (x, y) com 3 pontos.
Por padrão as coordenadas OpenGL estão no intervalo [-1, 1]
<sourcesyntaxhighlight lang="cpp">
GLfloat triangle_vertices[] = {
0.0, 0.8,
Linha 153:
0.8, -0.8
};
</syntaxhighlight>
</source>
 
Por enquanto manteremos esta estrutura de dados em mente, nos escreveremos os códigos depois.
Linha 165:
Nosso programa em GLSL ficará assim:
 
<sourcesyntaxhighlight lang="glsl">
#version 120
attribute vec2 coord2d;
Linha 171:
gl_Position = vec4(coord2d, 0.0, 1.0);
}
</syntaxhighlight>
</source>
 
{{wikipedia|GLSL#Versions}}
Linha 181:
 
Agora precisamos fazer que o OpenGL compile este shader. Então vamos para função <code>init_resources</code> acima da função <code>main</code>
<sourcesyntaxhighlight lang="c">
/*
Função: init_resources
Linha 213:
return 0;
}
</syntaxhighlight>
</source>
 
Nós passamos as informações como uma string para <code>glShader</code> (depois de ler todo o código da shader diferente e mais conveniente).
Linha 223:
Para cada pixel entre os 3 pontos, nós chamaremos um fragment shader, em nosso fragment shader, diremos que queremos preencher cada pixel com a cor azul:
 
<sourcesyntaxhighlight lang="glsl">
#version 120
void main(void) {
Linha 230:
gl_FragColor[2] = 1.0;
}
</syntaxhighlight>
</source>
 
Nos compilaremos semelhante-mente ao <code>GL_FRAGMENT_SHADER</code>. Vamos continuar nossa função <code>init_resources</code>:
 
<sourcesyntaxhighlight lang="c">
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
const char *fs_source =
Linha 250:
return 0;
}
</syntaxhighlight>
</source>
 
== Programando o GLSL ==
Linha 259:
 
 
<sourcesyntaxhighlight lang="c">
GLuint program; //váriavel global é muito exigido em programas com GLUT mesmo não sendo recomendado.
</syntaxhighlight>
</source>
 
Aqui é como um ''link(ligação)'' para o vertex e fragment shader no programa, continuaremos com o nosso <code>init_resource</code> com:
 
<sourcesyntaxhighlight lang="c">
program = glCreateProgram();
glAttachShader(program, vs);
Linha 275:
return 0;
}
</syntaxhighlight>
</source>
 
== Passaremos as vértices do triângulo para o Vertex Shader ==
Linha 285:
 
 
<sourcesyntaxhighlight lang="c">
GLint attribute_coord2d;
</syntaxhighlight>
</source>
 
terminaremos nosso <code>init_resources</code> com:
 
<sourcesyntaxhighlight lang="c">
const char* attribute_name = "coord2d";
attribute_coord2d = glGetAttribLocation(program, attribute_name);
Linha 301:
return 1;
}
</syntaxhighlight>
</source>
 
Agora nós passaremos nossas vértices do triângulo para o vertex shader.
Vamos escrever em nossa função <code>onDisplay</code>. cada seção é explicado nos comentários:
 
<sourcesyntaxhighlight lang="c">
void onDisplay()
{
Linha 337:
glutSwapBuffers();
}
</syntaxhighlight>
</source>
O <code>glVertexAttribPointer</code> chamará o OpenGL para recuperar cada vertices que foi criada no buffer de dados do <code>init_resources</code> e passará para o vertex shader. Estes vertices definirão a posição de cada ponto na tela, formando um triângulo, cujo os pixel são coloridos pelo fragment shader.
 
Linha 345:
Não necessário neste caso especifico, mas é bom ter esta estrutura em seus aplicativos:
 
<sourcesyntaxhighlight lang="c">
void free_resources()
{
glDeleteProgram(program);
}
</syntaxhighlight>
</source>
 
Nosso primeiro tutorial de OpenGL 2.0 está completo!