love.graphics.newShader (Português)

love.graphics.newShader


Disponível desde o LÖVE 0.9.0
Foi renomeado, antes era love.graphics.newPixelEffect.


O.png Esta função pode ser lenta, se for chamada repetidamente, como dentro de love.update ou love.draw. Se você precisa usar um recurso específico com frequência, crie-o uma vez e guarde-o em algum lugar onde possa ser reutilizado!  


Cria um novo objeto Shader para efeitos de vértice e de pixel com aceleração de hardware. Um Shader contém código de shader de vértice, código de shader de pixel, ou ambos.

Shaders são pequenos programas que rodam na placa de vídeo ao desenhar. Shaders de vértice são rodados uma vez para cada vértice (por exemplo, uma imagem tem 4 vértices - um em cada canto. Uma Malha pode ter muito mais.) Shaders de pixel rodam uma vez para cada pixel na tela que o objeto desenhado toca. O código do shader de pixel é executado depois que todos os vértices do objeto tenham sido processados pelo shader de vértice.

Função

Sinopse

shader = love.graphics.newShader( codigo )

Argumentos

string codigo
O código do shader de pixel ou de vértice, ou um nome de arquivo apontando para um arquivo com o código.

Retorna

Shader shader
Um objeto Shader usado em operações de desenho.

Função

Sinopse

shader = love.graphics.newShader( codigodepixel, codigodevertice )

Argumentos

string codigodepixel
O código do shader de pixel, ou um nome de arquivo apontando para um arquivo com o código.
string codigodevertice
O código do shader de vértice, ou um nome de arquivo apontando para um arquivo com o código.

Retorna

Shader shader
Um objeto Shader usado em operações de desenho.

Notas

Os argumentos codigodepixel e codigodevertice podem estar em qualquer ordem.

Linguagem do Shader

Shaders não são programados em Lua, e sim em uma linguagem de shaders especial. A linguagem de shader é basicamente GLSL 1.20 (especificações) com alguns nomes alternativos adicionados para os tipos existentes:

GLSL Linguagem de shader do LÖVE
float number
sampler2D Image
uniform extern
texture2D(tex, uv) Texel(tex, uv)

O código de shaders de vértice deve conter pelo menos uma função, chamada position (posição), que é a função que produzirá posições transformadas de vértices de objetos desenhados no espaço da tela.

O código de shaders de pixel deve conter pelo menos uma função, chamada effect (efeito), que é a função que vai produzir a cor misturada na tela para cada pixel tocado por um objeto desenhado na tela.

Função do Shader de Pixel

Sinopse

vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )

Argumentos

vec4 color
A cor de desenho definida com love.graphics.setColor ou a cor por vértice da Malha.
Imagem texture
A textura da imagem ou pintura sendo desenhada.
vec2 texture_coords
Coordenadas do pixel em relação à textura. O eixo y das pinturas é invertido. Coordenadas (1,1) seriam o canto superior direito da pintura.
vec2 screen_coords
Coordenadas do pixel na tela. Coordenadas de pixel não são normalizadas (diferentemente de coordenadas de textura)

Retorna

vec4 cor_de_saida
A cor do pixel.

Notas

Se está sendo feita renderização em pinturas múltiplas simultaneamente (dando-se múltiplos parâmetros Pintura para love.graphics.setCanvas, você pode usar a função effects (efeitos) em vez de effect (efeito) para produzir uma cor separada para cada Pintura. Ela tem o seguinte protótipo:

void effects( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
{
 // love_Canvases é um array de cores vec4 com permissão de escrita. Cada índice corresponde a uma Pintura. Se você não atribuir um valor para todas pinturas ativas, coisas ruins podem acontecer.
 love_Canvases[0] = color;
}

Função do Shader de Vértice

Sinopse

vec4 position( mat4 transform_projection, vec4 vertex_position )

Argumentos

mat4 transform_projection
A matriz de transformação afetada por love.graphics.translate e seus amigos combinada com a matriz de projeção ortográfica.
vec4 vertex_position
A posição crua, não transformada, do vértice atual.

Retorna

vec4 pos_de_saida
A posição transformada final do vértice atual.

Notas

O código do shader de vértice roda uma vez para cada vértice desenhado na tela (por exemplo, love.graphics.rectangle produzirá 4 vértices) e é usado para transformar as posições dos vértices de suas coordenadas originais para o espaço da tela, além de mandar informações como a cor de cada vértice e valores de coordenada de textura para o shader de pixel.

O código do shader de pixel roda uma vez para cada pixel na tela que o objeto desenhado toca, e é usado para produzir a cor que será misturada na tela naquele pixel, frequentemente lida de uma imagem. Shaders de pixel são às vezes chamados de shaders de fragmento.

A palavra-chave varying (variante) pode ser usada para definir um valor no shader de vértice e fazer com que seja interpolado entre vértices e passado adiante para o shader de pixel.

O código dos shaders de Vértice e de Pixel pode ser combinado em um arquivo ou string, se você embrulhar o código específico do vértice em #ifdef VERTEX .. #endif e o código específico do pixel em #ifdef PIXEL .. #endif.

Variáveis embutidas

O LÖVE oferece várias variáveis embutidas para shaders tanto de pixel quanto de vértice. A lista completa pode ser encontrada aqui: Variáveis de Shader.

Exemplos

Criar um shader usando código de shaders de vértice e de pixel que se comporta como se não houvesse shader.

function love.load()
 local codigodepixel = [[
 vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
 {
 vec4 texcolor = Texel(texture, texture_coords);
 return texcolor * color;
 }
 ]]
 
 local codigodevertice = [[
 vec4 position( mat4 transform_projection, vec4 vertex_position )
 {
 return transform_projection * vertex_position;
 }
 ]]
 
 shader = love.graphics.newShader(codigodepixel, codigodevertice)
end
 
function love.draw()
 love.graphics.setShader(shader)
 -- desenhar coisas
 love.graphics.setShader()
 -- desenhar mais coisas
end

Acessar a posição de vértice pré-transformada no shader de pixel com a palavra-chave varying (variante).

código do shader de vértice

varying vec4 vpos;
 
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
 vpos = vertex_position;
 return transform_projection * vertex_position;
}

código do shader de pixel

varying vec4 vpos;
 
vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
{
 texture_coords += vec2(cos(vpos.x), sin(vpos.y));
 vec4 texcolor = Texel(texture, texture_coords);
 return texcolor * color;
}

Combinar o exemplo acima em um único string ou arquivo com a ajuda de #ifdef.

varying vec4 vpos;
 
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
 vpos = vertex_position;
 return transform_projection * vertex_position;
}
#endif
 
#ifdef PIXEL
vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
{
 texture_coords += vec2(cos(vpos.x), sin(vpos.y));
 vec4 texcolor = Texel(texture, texture_coords);
 return texcolor * color;
}
#endif

Veja Também


Outras Línguas