Loading

Alison's New App is now available on iOS and Android! Download Now

Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Olá e bem-vindo à palestra número 27 no curso de computação gráfica. Estamos discutindo o pipeline de gráficos 3D, já que você pode se lembrar que tem 5 estágios e já discutimos 4 estágios em detalhes e atualmente estamos na quinta etapa. Então, deixe-nos apenas uma rápida reveja nos 5 estágios.
Como você pode ver nesta figura. Já discutimos primeiro estágio em detalhes, representação de objetos, depois transformação de modelagem de segunda fase, iluminação de terceiro estágio ou atribuição de cores, quarto estágio de visualização de estágio e atualmente estamos na quinta etapa de conversão ou renderização de estágio.
Agora, em conversão de varredura o que fazemos, nós essencialmente tentamos mapear a descrição de uma imagem dada no sistema de coordenadas do dispositivo a uma descrição na grade do pixel que significa, configurar pixels. Por isso, nas palestras anteriores cobrimos os métodos que são seguidos para tal mapeamento, para ponto, linha e círculo.
E vimos como podemos melhorar a eficiência desses métodos introduzindo melhores abordagens como o algoritmo de desenho de linha da Bresenham usado para conversão de varredura de linha, algoritmo de ponto médio para conversão de varredura de círculo e assim por diante. Hoje vamos discutir outra técnica de conversão de varredura relacionada a áreas de preenchimento, juntamente com isso também discutiremos como exibimos caracteres que significam as letras, números etc. na tela. Tentaremos obter uma ideia ampla sobre a renderização de caracteres.
Deixe-nos começar com a renderização da área de preenchimento. Então, primeiro deixe-nos tentar entender o que é uma área de preenchimento.
O que discutimos até agora, como determinar pixels que definem uma linha ou um limite de círculo.
Às vezes isso pode não ser o caso, às vezes podemos conhecer pixels que fazem parte de uma região. E podemos querer aplicar uma cor específica a essa região toda. Então, mais cedo o que fizemos? Nós determinamos pixels que fazem parte de uma única linha ou do limite do círculo, mas, às vezes, pode haver situações em que possamos ir para designar cores para região em vez de uma linha ou um limite.
Agora, isso é o mesmo que dizer que queremos encher uma região com uma cor especificada. Então, isso é a renderização da área de preenchimento, um dos tópicos da nossa discussão hoje. Por isso, quando estamos falando de preenchimento de área de preenchimento estamos nos referindo a uma região e nosso objetivo é preencher toda aquela região que significa os pixels que fazem parte daquela região com uma cor especificada. Isto em contraste com o que aprendemos anteriormente onde o nosso objetivo era descobrir pixels e é claro atribuir cores a elas que fazem parte de uma linha ou do limite de um círculo.
Vamos, tentar entender esse conceito com um exemplo. Considere um sistema de pintura interativo, então nesse sistema o que fazemos? Podemos tentar desenhar qualquer forma arbitrária e então podemos desejar atribuir algumas cores a essa forma, isso significa atribuir cores dentro do limite desse conjunto. Também, podemos querer mudar a cor, então primeira coisa é que podemos querer colorir, colorir aquela forma arbitrária que desenhamos.
Agora, quando dizemos que estamos tentando colorir alguma forma isso significa que queremos colorir o limite, assim como o interior. Podemos também querer mudar de cor e que também de forma interativa que significa selecionar alguma cor a partir de um cardápio, clique no interior da forma para indicar que a nova cor a ser aplicada a essa forma. Se você já usou algum sistema de pintura interativa, então você talvez já esteja familiarizadas com essas coisas.
Por exemplo, suponhamos que esta é a nossa tela e aqui traçamos uma forma algo assim, então pode haver um menu de cor ou dizer paleta de cores, então podemos escolher este menu, dizer por exemplo esta cor clique no nosso ponteiro do mouse ou tocar algum ponto dentro desta forma e então a cor do centro é aplicada no interior desta forma. Então, isso é coloração interativa de uma forma. E aqui como você pode ver, estamos preocupados com a coloração de uma região em vez de apenas o limite, ao contrário do que fizemos quando estávamos tentando determinar pixels bem como suas cores para linhas ou limites de círculo A questão é como podemos realizar tal enchimento ou enchimento de região? Agora, isso depende de como as regiões estão definidas, então pode haver maneiras diferentes de definir uma região e dependendo dessa definição podemos ter abordagens de enchimento de região.
Amplamente existem duas definições de uma região, uma é a definição de nível de pixel uma é a definição geométrica.
Em caso de definição de nível de pixels nós definimos uma região em termos de pixels que significa que podemos definir a região em termos de pixels de limite ou podemos definir a região em termos de pixels dentro de um limite. No primeiro caso quando estamos definindo uma região em termos de pixels de limite ou o conjunto de pixels que definem o limite tal definição é denominada limite definido.
No outro caso não definimos explicitamente um limite mas conjunto de pixels que define toda a região nesse caso nós chamamos de interior definido. Então, tais definições de pixels são úteis quando estamos lidando com regiões tendo limites complexos ou como acabamos de ver aplicativos como sistemas de pintura interativa. Por isso, para formas complexas, é difícil lidar com o limite, portanto, sua definição de nível de pixels pode ser útil. Também em sistemas interativos pixel definições de nível são muito úteis.
O outro tipo de definição de área de preenchimento é a definição geométrica, aqui definimos uma região em termos de primitivas geométricas como bordas e vértices que já vimos anteriormente durante as nossas técnicas de representação de objetos. Agora, essa abordagem em particular se destina principalmente às regiões poligonais. E essas definições são comumente usadas em pacotes de gráficos gerais, que já mencionamos anteriormente.
Portanto, definições essencialmente geométricas significam, definindo uma região em termos de primitivas geométricas como bordas, vértices, se você pode se lembrar de que discutimos tais coisas durante nossa discussão sobre representação objetiva onde usamos a lista de vertex, lista de borda para definir objetos ou regiões. E quando estamos lidando com definições geométricas, elas são principalmente destinadas a definir regiões que são poligonais em forma.
Agora, com esse conhecimento de duas definições amplas de regiões, vamos tentar entender os algoritmos de conversão de varredura de região diferente. Iniciaremos com uma abordagem simples que é chamada de algoritmo de preenchimento de sementes. Então, o que ele faz deixa-nos tentar entender.
Então, a ideia é muito simples para um algoritmo de preenchimento de sementes, começamos com um pixel interior e colorem a região progressivamente, essa é uma ideia simples.
Claramente aqui estamos assumindo uma definição de nível de pixel particularmente, uma definição de limite de uma região, onde os pixels de limite são especificados. E também assumimos que conhecemos pelo menos um pixel de interior, agora que pixel é chamado de pixel de semente e se conhecemos os pixels de limite podemos decidir sobre qualquer pixel de semente, é fácil, pois estamos lidando com um pixel de sementes, então o algoritmo é denominado algoritmo de preenchimento de sementes. Então, nós temos um pixel de sementes e temos definições de limite da região em termos de pixels.
Em seguida, neste algoritmo, também é assumido que os pixels de interiores são conectados a outros pixels em qualquer das duas formas, ou podem ser conectados a 4 pixels que são chamados 4 conectados ou podem ser conectados a 8 pixels, que é chamado 8 conectado. Agora, estes são os pixels vizinhos por exemplo supor que este é um pixel de semente e há pixels ao redor, se esta é a grade, onde o círculo mostra os pixels, então esses pixels podem ser assumidos para serem conectados a 4 pixels vizinhos ou a todos os 8 pixels vizinhos.
Assim sendo, a natureza da conexão é chamada de 4 conectada ou 8 conectada. Então, quando estamos falando de 4 conectados, nós essencialmente assumimos que nos deixe repelir a figura novamente, suponha que estes sejam os pixels esses pontos de interseção da grade, este é um pixel, agora em caso de 4 conectado os 4 pixels vizinhos são definidos como top, inferior, esquerda e direita que significa que este é o topo, isto é inferior, este é de direita e isto é esquerdo.
Enquanto que quando estamos lidando com 8 pixels conectados, estamos lidando com os 8 vizinhos de cima, de cima esquerda, este é o topo esquerdo, então top logo aqui, então esquerda, direita, fundo, fundo esquerdo isto é aqui e embaixo bem aqui. Então, qualquer uma dessas conexões podemos supor. E, assim, o algoritmo é executado.
Então, a ideia básica é simples nós mantemos uma pilha, o pixel de semente é empurrado primeiro para dentro da pilha e depois um loop executado até que a pilha não esteja vazia. Agora, em cada etapa, estouramos o pixel top pixel e atribuímos a cor desejada a esse pixel.
O algoritmo é mostrado aqui. Então, qual é a nossa entrada? A cor pixel de limite, cor especificada, que queremos atribuir à região e à semente ou pixel interior, qualquer pessoa semente pixel e a saída é o interior pixels com cor especificada que é o nosso objetivo. Começamos com empurrarmos o pixel de semente para uma pilha e então entramos em um loop onde definimos o pixel atual para ser o pixel topo de pilha ao pipocá-lo da pilha, aplicar cor especificada a esse pixel, então fazemos uso da propriedade conectada.
Então, se estamos assumindo que ele é um pixel conectado de 4, então para cada um dos 4 pixels conectados ou se estamos supondo que são 8 pixels conectados então para cada um dos 8 pixels conectados do pixel atual, o que fazemos? Verificamos se a cor pixel conectada não é igual a cor limite que significa que não atingimos o limite ou a cor pixel conectada não é igual à cor especificada que significa que ainda estamos para atribuir-lo qualquer cor, depois empurramos para a pilha.
Assim, para cada pixel empurramos 4 pixels conectados para a pilha ou 8 pixels conectados para a pilha dependendo da natureza de conectedness que estamos assumindo. E então a gente volta aqui e o laço continua ainda a pilha é vazia isso significa que alcançamos o limite ou temos atribuído cores a todos os pixels de interior. Essa é a ideia simples do algoritmo de preenchimento de sementes. Em seguida, discutiremos outra abordagem que se chama preenchimento de enchentes. A ideia é quase semelhante com algumas variações menores. Vejamos como funciona.
Agora, em caso de algoritmo de preenchimento de enchentes, assumimos uma definição diferente que é uma definição interior que significa que os pixels de interior são conhecidos. Mais cedo, assumimos definição de limite com apenas um pixel interior, ou seja, o pixel de sementes. Agora, aqui estamos assumindo a definição de interior, isso significa que todos os pixels de interior são conhecidos. E o nosso objetivo é colorir ou recolorir a região com uma cor especificada.
A ideia é semelhante ao preenchimento de sementes, com alguma diferença. Agora, neste caso as decisões são tomadas com base na cor interior original dos pixels atuais em vez de cor de pixel limite. Outras coisas permanecem as mesmas, isso significa usar uma pilha e utilizar os elementos de pilha de uma maneira particular, colorindo-os de uma maneira particular permanece o mesmo.
Então, o algoritmo é mostrado aqui novamente entrada é a cor pixel interior, cor especificada e o pixel de um interior ou pixel de semente, é ainda mais fácil aqui porque já conhecemos os pixels de interior e podemos captar aleatoriamente um pixel e a saída é depois de atribuir cores a todos os pixels o conjunto de pixels.
Agora, empurramos os pixels de semente para empilhar e como antes entramos em um loop, primeiro estouramos a pilha e configuramos para o pixel atual aplicando cor especificada, então assumindo conectivez como fizemos antes, lidamos com 4 ou 8 pixels conectados e para cada pixel fazemos a verificação, agora aqui o cheque é um pouco diferente em comparação com o que fizemos anteriormente. Aqui verificamos se a cor do pixel conectado é a cor interior.
Só que nesse caso empurramos o pixel conectado, pois aqui não podemos verificar a cor limite, não há limite especificado. E então continuamos como antes até que a pilha esteja vazia. Assim, em ambos os casos começamos com um pixel de sementes, mas em um caso estamos lidando com uma definição de limite de pixels, em outro caso estamos lidando com uma definição de interior de região em termos de pixels. E, assim, nosso algoritmo muda ligeiramente de outra forma a ideia ampla continua a mesma.
Discutiremos uma terceira abordagem, que conta com definição geométrica isto é chamado algoritmo de preenchimento de polígono de linha de varredura. Por isso, abordagens anteriores de preenchimento de sementes ou preenchimento de enchentes dependem de definições de pixel. Em caso de algoritmo de preenchimento de polígono de linha de varredura, dependemos de definição geométrica.
Então, aqui supomos que a região é definida em termos de seus vértices e bordas, é claro que aqui o pressuposto implícito é que a região é poligonal e os vértices são arredontados para os pixels mais próximos. Essas são as coisas que supomos.
Primeiramente discutiremos o algoritmo e depois tentaremos entendê-lo em termos de exemplo ilustrativo. Por isso, aqui a entrada é conjunto de vértices e a saída são os pixels, pixels de interiores com cor especificada. A partir dos vértices o que fazemos é determinar o máximo, as linhas mínimas de varredura, isso significa os valores de y máximo e mínimo para o polígono.
Então, por exemplo aqui suponha que esta seja a nossa grade de pixels e temos forma assim, por isso precisamos saber o mínimo y que é aqui ymin e máxima y que diz aqui o ymax. Então, este máximo e mínimo primeiro que determinamos, então começamos a partir da linha de varredura mínima, que é a mais baixada aqui.
E então entramos em um loop e continuamos no loop até que atingimos a linha de varredura máxima como mostrado nesta condição de loop. Então, no loop o que fazemos? Para cada borda ou o par de vértices do polígono se vá para uma verificação se a linha de varredura está dentro de uma determinada faixa definida pelas coordenadas y da borda então determinamos o ponto de interseção da linha de varredura de borda.
Depois desses passos o que fazemos? Nós ordenamos os pontos de interseção em ordem crescente de coordenadas x, isso significa que primeiro tentamos determinar os pontos de interseção então nós os classificamos em ordem crescente, em seguida, aplicar cor especificada nos pixels que estão dentro dos pontos de interseção todos os pixels intermediários aplicamos a cor e depois vamos para a próxima linha de varredura, essa é a ideia ampla.
Então, primeiro nós determinamos o mínimo e máximo começamos com o mínimo e continuamos o processamento até que a linha de varredura máxima seja atingida. Em cada etapa do processamento ou em cada execução de loop o que fazemos? Nós determinamos esses dois pontos de interseção da borda com as linhas de varredura para obter os dois extremos em uma única linha de varredura e, em seguida, atribuir cor especificada a todos os pixels que estão dentro desses extremos, essa é a ideia simples. Deixe-nos, agora, tentar entendê-lo em termos de um exemplo.
Passaremos por um exemplo ilustrativo para obter mais clareza sobre o algoritmo.
Consideremos esta figura. Aqui há um polígono ou área de preenchimento especificado com 4 vértices A, B, C e D como mostrado aqui. Agora, seguimos uma convenção de nomenclatura do vértice anti-horário, portanto, existem 4 bordas AB, BC, CD e DA.
Agora primeiro, determinamos a extensão mínima e máxima das linhas de varredura. Aqui tem 1 é o mínimo como você pode ver aqui e 6 é a linha de varredura máxima, isso nós determinamos como o primeiro passo.
Aí começamos o laço. Então, começamos a partir de 1 e continuamos até 6 e em cada execução do loop processamos uma linha de varredura. Assim, quando estamos começando com 1, então nosso objetivo é determinar os pontos de interseção da linha de varredura y igual a 1 com todas as 4 bordas no loop interno do algoritmo que é linhas de 6 10.
Se você executar as linhas, você descobrirá que para a borda AB a condição se estiver satisfeita e o ponto de interseção é A, para BC e bordas de CD a condição não está satisfeita, novamente para DA a condição é satisfeita e obtemos A novamente, portanto, o ponto de interseção é apenas A.
Como ele já é um vértice, não pode haver nenhum pixels intermediário. Assim, obtemos 2 pontos de interseção, que é o mesmo vértice A, assim ele é o único pixel e aplicamos a cor especificada.
Em seguida, vamos para a próxima iteração, configurando linha de varredura igual a 2 e verificando que 2 não é a linha de varredura máxima que é 6, portanto executamos o loop novamente.
Na segunda iteração do laço, o que fazemos? Verificamos pontos de interseção como antes com as bordas e a linha de varredura y igual a 2, que é essa linha de varredura.
Agora, por y igual a 2 e se verificarmos as bordas vemos que para AB se a condição for satisfeita significa que há um ponto de interseção, usando a equação da linha de borda e a equação da linha de varredura podemos obter o ponto de interseção como este, este ponto, para BC e CD a condição se não satisfaz para BC e CD, portanto não há interseção.
E para DA a condição satisfaz, novamente. Então, este é para ponto de interseção AB, este é para ponto de interseção da DA e este ponto de interseção DA podemos encontrar para ser (3, 2) usando a equação de linha para a borda bem como a equação da linha de varredura. Então, este ponto é um ponto de interseção, este ponto é outro ponto de interseção.
Em seguida, realizamos uma triagem como mencionado no algoritmo e obtemos esses dois pontos de interseção em uma ordem classificada como esta. Então, este é um ponto de interseção e este é o outro ponto de interseção. Em entre pixels estão lá como você pode ver então este si mesmo é um in-between pixel, então temos esse pixel, que é (4, 2) e então temos (5, 2).
Observe que o outro ponto de interseção não é um pixel em si mesmo porque envolve um número real como coordenada. Então, nós descobrimos os 3 pixels, que estão lá entre os dois pontos de interseção, então aplicamos cor especificada a esses pixels. Em seguida, reajustamos a linha de varredura para 3 e verificamos se 3 é a linha de varredura máxima, não é assim reentramos o loop novamente.
E de forma semelhante processamos as linhas de varredura y= 3, y= 4, y= 5 até y=6. Então, essa é a ideia do algoritmo. Então, para resumir aqui neste algoritmo de preenchimento de polígono de linha de varredura, o que fazemos? Assumimos uma representação geométrica da região, região poligonal em termos de bordas ou vértices. Em seguida, para cada linha de varredura que está lá entre as linhas de varredura mínima e máxima, o que fazemos? Nós determinamos os pontos de interseção das bordas com aquelas linhas de varredura, classificá-las para obter dois pontos de interseção extrema, identificar o in entre pixels e colorir esses pixels. E isso a gente faz para todas as linhas de varredura que estão lá entre o mínimo e as linhas de varredura máxima.
Agora, há duas coisas que requerem alguma elaboração no algoritmo.
Primeiro é como determinamos o ponto de interseção da linha de varredura de 8, que eu acho que todos vocês sabem que podemos usar a equação de linha que podemos determinar pelos dois terminais e podemos usar a equação da linha de varredura para obter o ponto de interseção. Por isso, essa equação de linha pode ser avaliada com o valor da linha de varredura para obter o ponto de interseção, que é uma abordagem muito simples e acho que todos vocês já podem saber como fazer isso.
Em segundo lugar como determinamos pixels dentro de dois pontos de interseção? Isso é novamente muito simples, começamos da esquerda mais pixel que é o ponto de interseção ou logo ao lado do ponto de interseção e depois continuar ao longo da linha de varredura até obter um valor de pixel que é menor do que o ponto de interseção certo. Pixel x coordenar nós verificamos em todos esses cheques. Por isso, ambos são simples, mas o segundo ponto que é como determinar pixels dentro de dois pontos de interseção não é tão simples quanto parece. E por que isso é assim?
Se assumirmos que temos um polígono côncavo, então há um problema. Então, muito qual seja a explicação que se dá é baseada na suposição de que estamos lidando com polígonos convexos. Para polígonos côncavos não é tão fácil determinar os pixels intermediários, um problema adicional está lá que precisa ser resolvido antes de determinar os pixels de interior.
Vamos, pegue um exemplo, aqui nesta figura como você pode ver este é um polígono côncavo, então quando estamos lidando com esses dois pontos de interseção extrema, alguns pixels estão fora do polígono, embora se seguirmos a abordagem que delineamos anteriormente que vamos apenas nos mover ao longo desta linha para obter todos os pixels intermediários, então os pixels externos também serão tratados como pixels de interior, que definitivamente não queremos. Então, nós precisamos ir para alguma abordagem diferente quando estamos lidando com polígonos côncavos. O que nós precisamos fazer é, precisamos determinar explicitamente dentro de pixels, pixels que estão dentro do polígono. Como se pode ver a partir da figura que não é tão óbvia para polígonos côncavos.
Por isso, neste caso precisamos realizar um teste externo para cada pixel que é claro um adicional de sobrecarinha.
E como podemos fazer isso? Assim, para cada pixel p o que podemos fazer é determinar a caixa de baterramento do polígono que é o máximo e valores mínimos x e y dos vértices de polígonos. Este é o primeiro passo, então na segunda etapa escolhemos um pixel arbitrário, vamos denotá-lo por p0, fora da caixa de bounding.
Por isso, neste caso, esta pode ser a nossa caixa de bounding, como você pode ver que cobre todos os vértices do polígono. Em seguida, escolhemos um pixel fora dessa caixa de bounding em algum lugar digamos aqui, isso significa escolher um ponto (x, y) que está fora do intervalo mínimo e máx das coordenadas do polígono. Na terceira etapa criamos uma linha unindo p e p0.
Por isso, criamos uma linha entre o pixel que está dentro que é o nosso pixel de preocupação e o ponto que está fora da caixa de bounding. Na etapa final vamos para alguns cheques, se a linha intersecar as bordas do polígono até mesmo número de vezes então p está fora, caso contrário, ele está dentro. Então, como você pode ver suponhamos que temos um pixel aqui e esses dois pixels se juntamos a ele se cruzam uma vez, isso é número ímpar de tempo, então esse pixel está dentro.
Enquanto que, se estamos lidando com um pixel aqui e estamos nos unindo a isso, assim como você pode ver aqui o cruzamento é duas vezes que é mesmo número de vezes, então esses pixels estão fora. Da mesma forma, esses pixels se juntamos a essas duas linhas, vemos que ele não intersecta as bordas do polígono, de modo que é 0, portanto, nesse caso também ele está fora.
Mas é claro que todas essas verificações levam tempo, por isso é uma sobrecaria adicional quando estamos lidando com polígonos côncavos. Caso contrário, o algoritmo de preenchimento de polígono de linha de varredura para polígonos convexos é bastante simples. Por isso, discutimos diferentes algoritmos de preenchimento de região, tanto para definições de nível de pixel como para definições geométricas.
Para definições de nível de pixels aprendemos sobre algoritmo de preenchimento de sementes e algoritmo de preenchimento de enchentes, ambos são semelhantes com variação menor. Para definições geométricas que aprendemos sobre algoritmo de preenchimento de polígono de linha de varredura, este algoritmo é bastante simples e direto quando estamos lidando com polígono convexo, mas requer verificações adicionais quando estamos lidando com polígonos côncavos. Agora, vamos tentar entender como os caracteres são exibidos na tela do computador. Então, como renderemos personagens?
Aqui, caractere significa caracteres alfanuméricos.
Agora, a renderização de caracteres é claro como todos nós sabemos que é uma questão importante, por exemplo considere esse slide, aqui vemos muitos caracteres alfanuméricos exibidos. Então, claramente é uma questão importante e este é o blocos de construção de qualquer conteúdo textual, por isso qualquer aplicação que lida com textos exibindo deve ter suporte para renderização de caracteres. E como é feito?
Como todos sabemos quando estamos lidando com algum aplicativo de processamento de texto, uma quantidade tipicamente grande de texto precisa ser exibida em curto tempo de duração. Por exemplo, se considerarmos o scrolling, agora com cada ação de scroll todo o conjunto de caracteres é revestido e isso tem que ser feito muito rapidamente. Por isso, renderização eficiente de personagens é uma questão muito importante em computação gráfica.
Agora, antes de tentarmos entender a renderização de caracteres, vamos ter um olhar rápido sobre a fonte da ideia e já sabemos provavelmente já ouvimos falar deste termo, então vamos ver o que é uma fonte e como ela é tratada dentro de computação gráfica.
Por isso, quando estamos falando de fonte, fonte ou tipo de letra denota estilo de design geral de personagens e há muitas fontes desse tipo como provavelmente todas nós estamos usando todos os dias como Times New Roman, Courier, Arial e etc. Por isso, essas fontes ou tipos de letra indicam o estilo de design dos personagens como eles olam.
Agora, cada fonte pode ser renderizada com aparência variada. Por isso, a aparência pode ser diferente, pode ser ousada, pode ser itálida ou pode ser tanto ousada quanto itálida.
Junto com isso há um outro conceito chamado tamanho, o quão grande ou pequeno o personagem aparece na tela. Então, isso é denotado por ponto, por exemplo uma fonte de 10 pontos, fonte de 12 pontos e assim em que é um grande de altura de caracteres em polegadas e este termo é emprestado da tipografia, mas em computação gráfica não usamos a medida original.
Em vez disso, assumimos que o ponto é equivalente a 1/72 de uma polegada ou aproximadamente 0,0139 polegada. E isso também é conhecido como DTP ou editoração de desktop ou postscript. Então, quando estamos falando de um ponto, assumimos que ele é de 1/72 de uma polegada ou de aproximadamente 0,0139 polegada, o que indica a altura do personagem.
Agora, com esse conhecimento básico, vamos tentar entender como os personagens são renderdos.
Assim, há amplamente duas maneiras de renderizar caracteres, um é bitmap um é delineado.
Em caso de fonte bitmap, definimos uma grade de pixels para cada caractere, por exemplo considere esta grade de 8 por 8 pixel e podemos definir a grade para o caractere B na capital, onde os pixels que fazem parte dos caracteres são marcados ON e outros são OFF. Assim, quando a grade for renderizada para B, somente aqueles pixels serão iluminados outros pixels não serão iluminados. Os círculos pretos aqui indicam os pixels ON como você pode ver aqui e as caixas brancas indicam os pixels OFF. Então, podemos ter esse tipo de grade para cada caractere quando estamos lidando com fonte bitmap.
Em contraste quando estamos lidando com fonte de esboço a abordagem é totalmente diferente, aqui os caracteres são definidos usando primitivas geométricas como pontos e linhas. Assim, poucos pixels talvez fornecidos e então outros pixels serão determinados usando técnicas de conversão de varredura para pontos, linhas e círculos.
Assim, essencialmente poucos pixels são fornecidos e usando aqueles pixels o computador desenhará os primitivos como linhas ou círculos para construir um caractere como criar uma imagem. Assim, em caso de fonte bitmapeada, já especificamos todos os pixels enquanto que em caso de fonte de esboço não especificamos todos os pixels, poucos pixels são especificados e usando-se aqueles que a forma geral é computada ou criada seguindo as técnicas de conversão de varredura.
As fontes claramente bitmapeadas são simples de definir e primeiro renderizar porque aqui nenhum cálculo está envolvido. Nós não precisamos computar nenhum pixels eles já estão especificados, mas ele tem alguns problemas.
Obviamente, ele exigirá armazenamento adicional, grande quantidade de armazenamento, pois para cada caractere estamos armazenando uma informação de grade de pixels e então se quisermos redimensionar ou remodelar para gerar diferentes efeito estiloso da fonte então isso não é facilmente possível com definições bitmapeadas e a fonte resultante pode parecer ruim.
A terceira preocupação é o tamanho da fonte depende de resolução de tela, pois estamos corrigindo a grade do pixel. Então, se a resolução mudar então a renderização pode não parecer boa. Por exemplo, suponhamos que tenhamos definido um bitmap de 12 pixels alto, ele produzirá um caractere de 12 pontos em uma resolução de 72 pixels por polegada. Agora, se mudarmos a resolução para 96 pixels por polegada então o mesmo bitmap produzirá um caractere de 9 pontos que podemos não querer. Então, dependendo da resolução o resultado pode mudar.
Por outro lado, fontes de contorno computam os pixels intermediários, eles não armazenam tudo, por isso requer menos armazenamento, ele pode realizar transformações geométricas com efeito satisfatório para remodelar e tudo redimensionar, portanto, a distorção será menor e não é dependente de resolução.
Mas por outro lado a renderização de tais fontes é lenta, o que é bastante óbvio porque as computações estão envolvidas, precisamos criar a forma, precisamos escanear a conversão da forma antes da renderização. Assim, devido a tais cálculos a renderização de cálculos é mais lenta em comparação com fontes bitmap. Sendo assim, ambas as abordagens têm seus lados positivos e negativos e dependendo dos recursos utilizados e do resultado desejado podemos escolher uma abordagem em particular.
O que quer que eu tenha discutido hoje pode ser encontrado neste livro, você pode passar pelo capítulo 9 seção 9,3 e 9,4 para obter mais detalhes sobre os tópicos que cobrimos hoje. Na próxima palestra, discutiremos uma questão interessante em conversão de varredura que é chamada de efeito aliasing até então obrigado e adeus.