Como criar um objeto padronizado com densidade variável de padrões em tempo real?

8

Suponha que exista algum valor p, calculado por quadro, que varie continuamente sobre a superfície de um objeto. O valor de pdetermina a densidade de algum padrão na superfície. Por exemplo, em um caso com apenas duas densidades possíveis, se p < 0.3for alta densidade, caso contrário, é baixo.

Pensei em uma solução simples de alto nível: crie duas texturas, cada uma com densidades diferentes, e com base no valor da pamostra a partir da apropriada. No entanto, há um problema com a fronteira entre altas e baixas densidades.

Aqui está um exemplo para ilustrar o problema (observe que meu problema NÃO é exclusivo desse exemplo de padrão de pontos. Descrevo os padrões com os quais estou trabalhando mais adiante):

insira a descrição da imagem aqui

E aqui está o limite entre baixa e alta (exibido na textura de alta densidade, mas isso não é relevante.) Se abaixo da linha, isso implica que a textura de alta densidade deve ser amostrada.

insira a descrição da imagem aqui

E, finalmente, aqui está a comparação entre o que é desejado e o que realmente aconteceria usando este método:

insira a descrição da imagem aqui

O problema é que quando um círculo somente de alta densidade cruza a linha, ele será ignorado quando pindicar a textura de baixa densidade a ser amostrada, resultando em um círculo truncado. Eu não sei como resolver esse problema porque pvaria em cada quadro, por isso não posso simplesmente 'estabelecer' um limite entre as duas densidades. É fácil evitar o problema inverso criando a textura de alta densidade a partir da inferior (por exemplo, se um círculo estiver na textura de baixa densidade, verifique se está na textura de alta densidade).

Estou interessado em saber se alguém tem uma maneira de melhorar minha solução ou se possui outro método completamente. A restrição aqui é que pé calculada por quadro em tempo real. Outra restrição está relacionada à textura do padrão: o padrão é preto e branco, onde preto é o padrão e branco é o plano de fundo (como os círculos no exemplo). O padrão pode não ser apenas formas idênticas repetidas, mas qualquer disposição de formas pretas arbitrárias sobre um fundo branco. (Talvez padrão seja a escolha errada da palavra.)

Eu não estou familiarizado com a pesquisa nesse campo, então não tinha certeza de quais palavras-chave pesquisar, então eu apreciaria se alguém pudesse me indicar a direção certa.

Ryan
fonte
3
A sua textura real também é apenas pontos pretos em branco? Nesse caso, você poderá gerar a textura proceduralmente, por exemplo, com amostragem de disco de Poisson com raios variados. Caso contrário, se sua textura for realmente mais contínua, a mistura poderá ser uma opção (que não funcionaria bem para texturas nítidas como o seu exemplo). Portanto, se você puder esclarecer como é o padrão / textura atual, isso pode ajudar a obter respostas mais úteis.
Martin Ender
11
Pós-processo? Algo parecido com uma variante na detecção de arestas: escreva a distância até o centro do ponto mais próximo e, no espaço da tela, procure na vizinhança de cada pixel o valor de zero (próximo a). Isso fornece pontos de espaço na tela, para que você precise escrever e mexer com derivados UV para voltar ao espaço de textura ... Observe que você ainda tem um problema de continuidade - conforme o limite alto / baixo p se move pela superfície, os pontos aparecem e desaparecer. Se p pode ser contínua (um limite suave) que você pode ser capaz de encolher / crescer os pontos ao longo da fronteira ...
Daniel M Gessel
11
Outra opção é examinar os azulejos de Wang. introdução , genética azulejos , pedras preciosas GPU
maogenc
11
Você já viu o bombardeio de textura? http.developer.nvidia.com/GPUGems/gpugems_ch20.html
Mikkel Gjoel
11
Você pode dar uma idéia da variedade de formas / padrões que precisa cobrir e quanta flexibilidade pode haver na abordagem? A sugestão de @ DanielMGessel de alterar os raios do círculo em vez de sua densidade pode tornar as coisas mais simples e proporcionar uma animação mais suave, mas ainda não está claro o quanto sua abordagem está restrita.
Trichoplax

Respostas:

6

Para garantir que as formas do padrão estejam sempre presentes ou ausentes, nunca cortadas, é necessário garantir que o mesmo pvalor seja usado para todos os texels da forma. No seu exemplo de círculos, todos os texels de um determinado círculo precisam concordar p.

Suponho que você tenha alguma maneira de avaliar pem um determinado ponto da superfície (se é pesquisado a partir de uma textura ou calculado a partir de alguma função). Então, uma maneira de garantir que um grupo de texels obtenha o mesmo pvalor é garantir que todos procurem no mesmo ponto.

Os UVs deste ponto de avaliação podem ser armazenados em canais extras da textura do padrão. Por exemplo, você pode fazer com que os canais vermelho e verde armazenem as coordenadas UV nas quais avaliar p, o canal azul armazene o limite no qual ativar esse elemento do padrão e o alfa armazene o nível de cinza antialias do padrão a ser exibido. Os dados do limite de UV + também podem estar em uma textura secundária separada, se desejado.

Para gerar essa textura de limiar UV +, iniciando a partir de uma textura de padrão de entrada, você pode encontrar programaticamente componentes conectados (por exemplo, pesquisando pixels pretos e preenchimento). Defina o ponto de avaliação para todos os texels em cada componente como a UV do centro do componente e gere um limite aleatório para ele. Em seguida, ao renderizar, use um sombreador de pixel que primeiro prove essa textura, depois procure pno ponto de avaliação especificado e compare-o com o limite especificado.

Dessa forma, cada forma de padrão verá um pvalor e limite uniformes e será ativada ou desativada completamente. À medida que paumenta, mais formas passam pelo limite e aparecem, dando a impressão de uma densidade continuamente variável.

Nathan Reed
fonte
11
Eu realmente gosto dessa idéia, vou ter que experimentar. Faz todo o sentido. Obrigado!
Ryan
0

Outro pensamento é nesse sentido. Se você tiver um conjunto de pontos uniforme definido no plano e uma função de mapeamento do plano para a superfície de destino, a função de densidade na superfície é como as áreas são mapeadas da superfície do plano para o destino. Portanto, um mapa de preservação de área resultaria em pontos uniformes no alvo.

MB Reynolds
fonte