Vertex Shader é um estágio programável do pipeline gráfico que processa cada vértice de um modelo 3D de forma independente. De acordo com Khronos Group, 2025, o shader de vértices recebe como entrada os atributos dos vértices — coordenadas, normais, cor e coordenadas de textura — e os transforma de acordo com a lógica definida. Vertex Shader é executado para cada vértice independentemente, permitindo paralelizar eficientemente os cálculos em milhares de núcleos de GPU.
Principais pontos
Vertex Shader é um estágio programável do pipeline gráfico que processa cada vértice de um modelo 3D individualmente. Um vértice é um ponto no espaço tridimensional que contém atributos: coordenadas xyz, normais, cor e coordenadas de textura UV.
Ao contrário do pipeline de função fixa (fixed-function pipeline) onde as transformações eram realizadas de acordo com um algoritmo rígido, o Vertex Shader dá ao desenvolvedor controle total sobre a transformação de vértices. Isso permite implementar animação processual, deformação de modelos, skinning esquelético e qualquer transformação matemática no lado da GPU.
O pipeline gráfico do OpenGL ES inclui uma sequência de estágios desde os dados de entrada até a imagem final. Vertex Shader está localizado após o estágio de montagem de vértices e antes do estágio de rasterização. Cada vértice enviado da CPU através de um buffer de vértices passa pelo Vertex Shader exatamente uma vez, e o resultado é encaminhado para o próximo estágio para montagem de primitivas.
| Estágio do pipeline | Propósito |
|---|---|
| Vertex Specification | Transferência de dados e atributos de vértices do VBO |
| Vertex Shader | Processamento de cada vértice, transformação de coordenadas |
| Tessellation | Subdivisão opcional da geometria em subprimitivas |
| Geometry Shader | Geração ou remoção opcional de primitivas |
| Rasterization | Conversão de primitivas em fragmentos para preenchimento |
Vertex Shader recebe os atributos dos vértices do buffer de vértices (VBO) através de ponteiros de atributos de vértice configurados no código da CPU. O desenvolvedor escreve o código do shader em GLSL (OpenGL Shading Language) ou uma linguagem equivalente, que o driver da GPU compila em instruções de máquina para o chip específico.
Para cada vértice, o Vertex Shader realiza sequencialmente três operações: leitura dos atributos de entrada — aplicação das transformações definidas pelo desenvolvedor — escrita dos resultados em variáveis de saída. A saída mínima necessária é a posição do vértice no espaço de recorte (gl_Position). Todos os outros dados de saída (cor, normais, coordenadas de textura) são interpolados e passados para o próximo estágio — o Fragment Shader.
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
Vertex Shader resolve uma ampla gama de tarefas do pipeline gráfico relacionadas à transformação de geometria. Cada tarefa é implementada através de operações matemáticas em vetores e matrizes, executadas em paralelo para milhares de vértices simultaneamente.
A tarefa básica e mais comum é multiplicar as coordenadas dos vértices pelas matrizes model, view e projection (MVP). A matriz MVP transforma um vértice do espaço local do modelo para o espaço de recorte (clip space), que é então normalizado e convertido em coordenadas de tela nos estágios automáticos do pipeline.
Para personagens animados, o Vertex Shader implementa a animação esquelética (skinning). Cada vértice está vinculado a vários ossos com pesos específicos. Vertex blending — uma soma ponderada de transformações dos ossos vinculados — permite deformar suavemente a pele do personagem quando o esqueleto se move.
O Vertex Shader pode modificar a geometria com base no tempo ou em outros parâmetros uniform sem envolvimento da CPU. Wave deformation, deslocamento por ruído Perlin e efeitos de ondulação na água — todos esses efeitos são implementados no shader de vértices sem recarregar a geometria da RAM.
Embora ambos os tipos de shaders sejam estágios programáveis do pipeline gráfico, Vertex Shader e Fragment Shader resolvem tarefas fundamentalmente diferentes e operam em estágios distintos do processamento de imagem.
| Característica | Vertex Shader | Fragment Shader |
|---|---|---|
| Dados de entrada | Atributos de vértices do VBO | Dados interpolados do VS |
| Número de invocações | Número de vértices | Número de fragmentos |
| Tarefa principal | Transformação de geometria | Cálculo da cor do pixel |
| Carga computacional | Complexidade da geometria | Resolução da tela |
| Acesso a texturas | Limitado (via texture lookup) | Acesso completo |
A diferença chave é a frequência de invocação. Vertex Shader é chamado uma vez por vértice, enquanto Fragment Shader é chamado para cada fragmento (pixel). Em uma cena de alta resolução, o número de invocações do Fragment Shader excede o número de invocações do Vertex Shader em milhares de vezes, tornando a otimização dos shaders de pixel ainda mais crítica.
O desempenho do Vertex Shader é criticamente importante para aplicações em tempo real, especialmente no desenvolvimento mobile com consumo de energia limitado. Os principais fatores de desempenho são o número de vértices, a complexidade do código do shader e a largura de banda da memória da GPU.
Para reduzir a carga no Vertex Shader, as seguintes abordagens são utilizadas. Level of Detail (LOD) — mudança para versões simplificadas de modelos quando a câmera se afasta do objeto. Instancing — desenho repetido da mesma geometria com diferentes matrizes de transformação em uma única chamada de desenho (draw call).
// Vertex Shader com suporte a instancing
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;
void main() {
vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
gl_Position = uViewProjection * worldPos;
}
Vertex Shader em diferentes APIs gráficas tem lógica similar, mas sintaxe e convenções de nomenclatura diferentes. Vamos implementar um shader de vértices básico em GLSL para OpenGL ES 3.0 e em Metal Shading Language para iOS e macOS.
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;
void main() {
vec4 mvPosition = modelViewMatrix * position;
vPosition = mvPosition.xyz;
vNormal = normalMatrix * normal;
vTexCoord = texcoord;
gl_Position = projectionMatrix * mvPosition;
}
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
constant float4x4& mvp [[buffer(1)]]) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
Perguntas frequentes
Vertex Shader é um programa na GPU que processa cada vértice de um modelo 3D e transforma suas coordenadas em coordenadas de tela. Imagine um modelo como uma malha de pontos; o shader de vértices move esses pontos de acordo com regras matemáticas definidas.
Vertex Shader processa os vértices e lida com a geometria, enquanto o Fragment Shader determina a cor de cada pixel. O primeiro é chamado para cada vértice (milhares), o segundo para cada pixel (milhões).
Vertex Shader é escrito em uma linguagem correspondente à API gráfica: GLSL para OpenGL ES, Metal Shading Language para Metal API no iOS/macOS, HLSL para Direct3D. Conceitualmente, todas realizam as mesmas operações nos vértices.
A complexidade do shader de vértices afeta diretamente os FPS: mais instruções por vértice = maior tempo de processamento. A otimização inclui reduzir o número de vértices através de LOD, usar instancing e minimizar ramificações condicionais no código do shader.
Principais tarefas em jogos: transformação de coordenadas através de matrizes MVP, skinning de personagens animados, deformação processual de roupas e cabelos, morphing entre expressões faciais e efeitos de partículas com animação na GPU.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também