WebGL - Desenhando um modelo
Depois de associar os buffers aos sombreadores, a etapa final é desenhar as primitivas necessárias. WebGL fornece dois métodos, a saber,drawArrays() e drawElements() para desenhar modelos.
drawArrays ()
drawArrays()é o método usado para desenhar modelos usando vértices. Aqui está sua sintaxe -
void drawArrays(enum mode, int first, long count)
Este método leva os seguintes três parâmetros -
mode- No WebGL, os modelos são desenhados usando tipos primitivos. Usando o modo, os programadores precisam escolher um dos tipos primitivos fornecidos pelo WebGL. Os valores possíveis para esta opção são - gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN e gl.TRIANGLES.
first- Esta opção especifica o elemento inicial nas matrizes habilitadas. Não pode ser um valor negativo.
count - Esta opção especifica o número de elementos a serem renderizados.
Se você desenhar um modelo usando drawArrays() método, então WebGL, enquanto renderiza as formas, cria a geometria na ordem em que as coordenadas do vértice são definidas.
Exemplo
Se você deseja desenhar um único triângulo usando drawArray() método, então você tem que passar três vértices e chamar o drawArrays() método, conforme mostrado abaixo.
var vertices = [-0.5,-0.5, -0.25,0.5, 0.0,-0.5,];
gl.drawArrays(gl.TRIANGLES, 0, 3);
Isso produzirá um triângulo conforme mostrado abaixo.
Suponha que você queira desenhar triângulos contíguos, então você tem que passar os próximos três vértices em ordem no buffer de vértices e mencionar o número de elementos a serem renderizados como 6.
var vertices = [-0.5,-0.5, -0.25,0.5, 0.0,-0.5, 0.0,-0.5, 0.25,0.5, 0.5,-0.5,];
gl.drawArrays(gl.TRIANGLES, 0, 6);
Isso produzirá um triângulo contíguo conforme mostrado abaixo.
drawElements ()
drawElements()é o método usado para desenhar modelos usando vértices e índices. Sua sintaxe é a seguinte -
void drawElements(enum mode, long count, enum type, long offset)
Este método leva os seguintes quatro parâmetros -
mode- Os modelos WebGL são desenhados usando tipos primitivos. Usando o modo, os programadores precisam escolher um dos tipos primitivos fornecidos pelo WebGL. A lista de valores possíveis para esta opção são - gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN e gl.TRIANGLES.
count - Esta opção especifica o número de elementos a serem renderizados.
type - Esta opção especifica o tipo de dados dos índices que devem ser UNSIGNED_BYTE ou UNSIGNED_SHORT.
offset- Esta opção especifica o ponto de partida para renderização. Geralmente é o primeiro elemento (0).
Se você desenhar um modelo usando drawElements(), então o objeto de buffer de índice também deve ser criado junto com o objeto de buffer de vértice. Se você usar este método, os dados do vértice serão processados uma vez e usados quantas vezes forem mencionadas nos índices.
Exemplo
Se você quiser desenhar um único triângulo usando índices, você precisa passar os índices junto com os vértices e chamar o drawElements() método conforme mostrado abaixo.
var vertices = [ -0.5,-0.5,0.0, -0.25,0.5,0.0, 0.0,-0.5,0.0 ];
var indices = [0,1,2];
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);
Ele produzirá a seguinte saída -
Se você deseja desenhar triângulos contagiosos usando drawElements() método, basta adicionar os outros vértices e mencionar os índices para os vértices restantes.
var vertices = [
-0.5,-0.5,0.0,
-0.25,0.5,0.0,
0.0,-0.5,0.0,
0.25,0.5,0.0,
0.5,-0.5,0.0
];
var indices = [0,1,2,2,3,4];
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);
Ele produzirá a seguinte saída -
Operações Requeridas
Antes de desenhar uma primitiva, você precisa realizar algumas operações, que são explicadas a seguir.
Limpar a tela
Primeiro de tudo, você deve limpar a tela, usando clearColor()método. Você pode passar os valores RGBA de uma cor desejada como parâmetro para este método. Em seguida, o WebGL limpa a tela e a preenche com a cor especificada. Portanto, você pode usar este método para definir a cor de fundo.
Dê uma olhada no exemplo a seguir. Aqui estamos passando o valor RGBA da cor cinza.
gl.clearColor(0.5, 0.5, .5, 1);
Habilitar teste de profundidade
Habilite o teste de profundidade usando o enable() método, conforme mostrado abaixo.
gl.enable(gl.DEPTH_TEST);
Limpe o bit do buffer de cor
Limpe a cor, bem como o buffer de profundidade usando o clear() método, conforme mostrado abaixo.
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
Definir a porta de visualização
A porta de visualização representa uma área retangular visível que contém os resultados da renderização do buffer de desenho. Você pode definir as dimensões da janela de visualização usandoviewport()método. No código a seguir, as dimensões da porta de visualização são definidas para as dimensões da tela.
gl.viewport(0,0,canvas.width,canvas.height);