Views
love.graphics.newShader (Português)
love.graphics.newShader
Disponível desde o LÖVE 0.9.0 |
Foi renomeado, antes era love.graphics.newPixelEffect. |
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
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
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
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:
{
// 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
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.
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
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
vpos = vertex_position;
return transform_projection * vertex_position;
}
código do shader de 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;
}
Combinar o exemplo acima em um único string ou arquivo com a ajuda de #ifdef.
#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
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info