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 31 no curso Computer Graphics. Então, essa vai ser a nossa palestra final sobre o tema. Então, longe o que discutimos?
Discutimos pipeline e, então, atualmente estamos discutindo a implementação de pipeline. Em nossas palestras anteriores aprendemos sobre o hardware gráfico básico incluindo os dispositivos de entrada e saída de gráficos, a Unidade de Processamento GPU ou Graphics e a ideia básica de programação GPU. Hoje em nosso, este último tópico que vamos aprender sobre programação ou como escrever programas gráficos que é essencialmente o aspecto de software da Computer Graphics.
Agora, antes de aprenderem a programar, vamos começar pela primeira vez com uma introdução básica aos softwares gráficos. Se você pode se lembrar durante as nossas palestras introdutórias, tivemos uma introdução preliminar mas hoje vamos recapitear, assim como expandir essas discussões.
Como mencionamos o software gráfico anterior são amplamente de dois tipos. Um deles são os pacotes de propósito especial e o outro são pacotes gerais de programação.
Nos pacotes de propósito especial, o que temos? Estes são sistemas de software essencialmente completos com suas próprias GUIs ou interfaces de usuário. Por exemplo, sistema de pintura aqui ele tem sua própria interface de usuário através da qual um artista pode selecionar objetos, selecionar cor, colocar os objetos na posição desejada no Canvas ou na tela, alterar o tamanho do objeto, alterar a forma, também orientação e assim por diante.
E tudo isso, o artista pode fazer interagindo com a interface do usuário. Por isso, lá o artista não precisa saber nada sobre o pipeline gráfico ou como ele é implementado. Estes são exemplos de sistemas ou pacotes de software completos. Outro exemplo é o pacote CAD que aprendemos sobre nas palestras introdutórias, pacotes CAD ou Computer Aided Design. Estes são usados principalmente em arquitetura, medicina, negócios, engenharia e tais domínios.
O outro tipo de software é o pacote de programação geral. Agora, aqui temos bibliotecas, bibliotecas de funções gráficas que são fornecidas e podemos utilizar aquelas bibliotecas com qualquer linguagem de programação como C, C + +, ou Java e essas funções são média para executar ou melhor, para ajudar um programador a executar tarefas de pipeline. Por isso, em outras palavras eles ajudam o programa e implementam o pipeline.
Um exemplo é o OpenGL, que fica para a Biblioteca Open Source Graphics. Também existem VRML Virtual Reality Modeling Language, Java 3D e assim por diante. Então, existem muitas bibliotecas dessas fornecidas para implementar funções gráficas.
Agora, essas funções também são conhecidas como interface de programação de aplicativos de computação gráfica ou API CG. Agora, eles são essencialmente uma interface de software entre a linguagem de programação e o hardware. Por exemplo, quando queremos gravá-lo um programa de aplicativos em uma linguagem digamos C, essas funções da biblioteca nos permitem construir e exibir figuras no dispositivo de saída. Então, sem essas funções não será capaz de fazê-lo.
Mas uma coisa que devemos ter em mente é que as funções gráficas são tipicamente definidas independentes da linguagem de programação e que é alcanada através de um conceito chamado de linguagem vinculativa. Por isso, a ligação linguística é definida para uma determinada linguagem de programação de alto nível.
Agora, através de tal ligação obtemos a sintaxe particular a ser usada para acessar várias funções gráficas a partir dessa linguagem. Por isso, a ligação essencialmente linguística nos permite utilizar essas funções da biblioteca de dentro de um programa escrito usando uma determinada linguagem.
Agora, cada ligação de idioma é projetada para fazer o melhor uso das capacidades ali para uma determinada língua e eles são projetados para tratar de várias questões de sintaxe como tipos de dados, passagem de parâmetro e manipulação de erros. Agora, essas especificações ou ligação de idioma são definidas pela ISO ou Organização Internacional Padrão, por isso precisamos saber sobre esses padrões. Teremos uma breve introdução a diferentes padrões utilizados para computação gráfica.
Então, quais são esses padrões, padrões de software que são usados em computação gráfica?
Agora, por que precisamos de padrão deixe-nos tentar entender de novo. Quando estamos escrevendo um programa com funções gráficas, pode ser o caso de que esses programas sejam movidos de uma plataforma de hardware para outra. Agora, como o computador vai entender então o programa se a plataforma for alterada? Lá nós exigimos padrão, sem alguns padrões que é essencialmente uma sintaxe comumente acordada, esse movimento entre plataformas não será possível e precisamos reescrever todo o programa. Então, essencialmente precisamos começar do zero. Então, o padrão nos ajuda a evitar em tal situação.
Primeiro padrão gráfico veio em 1984, há muito tempo que era conhecido como sistema de kernel gráfico ou em GKS curto. Ela foi adotada pela ISO assim como muitos outros organismos de padrão nacional.
Em seguida, veio um segundo padrão que foi desenvolvido ao estender o GKS, ele foi chamado de PHIGS, que defende a norma de gráficos interativos hierárquicos do programador. 'PHIGS', novamente ela foi então adotada pelas organizações de padrões no mundo todo.
Agora, por volta da mesma época em que os outros padrões estavam sendo desenvolvidos Silicon Graphics Inc ou SGI começaram a embaralhar suas estações de trabalho feitas para gráficos com um conjunto de rotinas ou funções de biblioteca juntas estas são chamadas de biblioteca gráfica para GL.
Posteriormente esse conjunto de funções ou GL se tornou muito popular e acabou evoluindo como o OpenGL no início dos anos 1990s, que havia se tornado um padrão gráfico de fato. Agora, essa norma é agora mantida pelo conselho de revisão de arquitetura OpenGL que é um consórcio de representantes de muitas empresas e organizações gráficas.
Agora, vamos tentar entender o que existe no OpenGL, quais as funções que ele fornece e como utilizar essas funções.
Vamos tentar entender o OpenGL com relação a um programa de exemplo. Então, esse programa é mostrado aqui, este programa tem o objetivo de exibir uma linha reta na tela. Agora, isso foi escrito utilizando funções da biblioteca OpenGL chamada de C, a linguagem C. Agora, vamos tentar entender a sintaxe do programa.
Por isso, para fazer uso das funções da biblioteca, a primeira coisa que devemos fazer é incluir um arquivo de cabeçalho. Agora, este arquivo de cabeçalho contém as funções da biblioteca, então aqui nós incluímos com este hash de instrução include GL slash glut dot h. Agora, o que esse nome de biblioteca significa?
A biblioteca principal do OpenGL realmente não suporta operações de entrada e saída porque essas funções foram projetadas para ser dispositivo independente, enquanto que o suporte para E/S é ou deve ser dependente de dispositivo. Então, precisamos fazer algo sobre isso porque temos que exibir a linha sobre a saída que é essencialmente um dispositivo dependente de operações.
Assim, para exibir precisamos de bibliotecas auxiliares em cima da biblioteca de código, isso é fornecido pela biblioteca de bibliotecas GLUT ou OpenGL, biblioteca de 'GLUT', biblioteca GLUT, que é mencionada neste comunicado de inclusão.
Agora, o GLUT fornece uma biblioteca de funções para interagir com qualquer sistema windowing de tela essencialmente qualquer dispositivo de exibição e ele nos permite configurar uma janela de exibição em nossa tela, nesta janela vamos mostrar a imagem ou o que quisermos exibir e esta janela de exibição é essencialmente uma área retangular que contém a imagem, que podemos fazer com a ajuda de funções fornecidas na biblioteca GLUT.
Agora, consoante as funções de biblioteca que usamos que fazem parte da GLUT elas vêm com o prefixo 'glut'.
Então, essencialmente essas funções fornecem interface para outros sistemas de janela específicos do dispositivo que já mencionamos. Assim, podemos escrever programas independentes de dispositivo usando essas funções GLUT e as próprias funções são usadas para vincular o nosso programa ao dispositivo particular.
Também devemos notar aqui é que a biblioteca GLUT é adequada para operações gráficas apenas e para qualquer outra operação podemos precisar incluir outros arquivos de cabeçalho como stdio.h ou stdlib.h como fazemos em nossos programas regulares.
Agora, vamos começar com a função principal que é mostrada aqui, esta função e vamos tentar entender o corpo da função. Como dissemos GLUT nos permite criar e gerenciar uma janela de exibição ou a região da tela sobre a qual queremos exibir a linha. Então, a primeira coisa que é necessária é inicializar o GLUT com o glútInit de instrução como mostrado aqui, esta é a função de inicialização que é necessária no início.
Após a inicialização, podemos configurar várias opções para a janela de exibição usando a função glutInitDisplayMode como mostrado na segunda instrução. Então, quais são essas opções?
Agora, essas opções são fornecidas por constantes de GLUT simbólicas como argumentos como mostrado aqui, GLUT_SINGLE, GLUT_RGB.
Agora, aqui nesta função em particular utilizamos esta declaração tendo esses dois argumentos GLUT_SINGLE e GLUT_RGB, eles indicam que estamos especificando um único buffer de atualização a ser usado para a janela de exibição e o modo de cor RGB a ser usado para a seleção de valores de cores. GLUT_SINGLE é para o buffer de atualização única da primeira tarefa e GLUT_RGB indica que o modo de cor RGB a ser usado.
Agora, aqui devemos olhar para a sintaxe, como essa função glutInitDisplayMode é usada. No nome constante que fornece as opções, utilizamos GLUT como prefixo todas as capas seguidas de um símbolo de sublinhado e então o nome constante novamente todas as capas como mostrado aqui ou aqui esta é a sintaxe particular usada para fornecer argumentos. Agora, para combinar várias opções estamos usando essa lógica ou operação, para indicar que queremos tanto é que a sintaxe utilizada para fornecer as opções.
Em seguida, estamos usando as duas funções glutInitwindowPosition e glutInitwindowSize. Agora, estes são usados para fornecer alguns valores que são diferentes dos valores padrão para o tamanho da janela e posição que já está lá na função de biblioteca. Então, se quisermos alterar os valores então precisamos usar essas duas funções glutInitwindowPosition onde está especificar o valor e o glutInitwindowSize onde especificamos novamente o valor de tamanho.
Agora, esta posição de janela, qual posição é especifica? Ele especifica posição de canto superior esquerdo da janela. Assumindo sistema de coordenadas de tela inteiro e assumindo origem no canto superior esquerdo. Essas são as suposições quando especificamos esses valores.
Em seguida, em caso de glutInitwindowSize onde estamos especificando o tamanho, o primeiro argumento especifica largura que significa 800, segundo argumento especifica altura que é 600 e ambos esses valores estão em pixels, portanto 800 pixels por 600 pixels. Então, nós entendemos essas quatro funções init, displaymode, windowPosition e windowSize.
Ao lado criamos a janela e configuramos uma legenda que é opcional usando a função Createwindow e a legenda é fornecida dentro de parênteses, mas esta legenda é opcional.
A próxima coisa que fazemos é especificar que a figura é para ser exibida na janela que é a linha. Agora, temos que criar a linha e depois podemos exibi-la na janela, esta criação é feita por uma função separada que é o usuário definido que estamos chamando de função createLine.
Agora, essa função createLine é passada como um argumento para outra função de biblioteca de glút que é o glutDisplayFunction que é mostrado aqui. Isso indica que a linha deve ser exibida na janela. Então, com essa função indicamos que estamos criando uma linha que é a nossa imagem aqui que está usando a função de criação de linha e esta linha deve ser exibida na janela criada por meio dessas instruções. Mas antes de fazer isso certas inicializações são necessárias.
E essas inicializações são executadas na função init mostrada aqui. Novamente esta função init é usada para fazer com que nosso código pareça muito limpo, caso contrário poderíamos tê-lo usado de uma maneira diferente e que voltará para esta função mais tarde.
Por isso, para manter o código limpo e indicar que queremos exibir uma linha na janela adicionamos essas duas linhas init e glutDisplayFunction como mostrado aqui.
Agora, aqueles são todos feitos mas a janela ainda não está na tela, precisamos ativá-la uma vez que o conteúdo da janela é decidido, que fazemos com essa função glutMainLoop. Aqui ele ativa todas as janelas de exibição criadas junto com seus conteúdos gráficos. Então, essa função glutMainLoop realmente coloca a janela com seu conteúdo na tela.
Essa função deve ser a última em nosso programa, ela coloca o programa em um loop infinito porque o display que queremos constantemente. Neste loop o programa espera por entradas a partir de dispositivos um dispositivo de entrada como mouse, teclado, mesmo que não haja entrada o loop garante que a figura é exibida até que a janela esteja fechada. Assim, já que queremos que a figura permaneça na tela a menos que haja alguma entrada ou a janela esteja fechada utilizamos o loop e este loop deve estar na última instrução do código em main após criarmos a imagem e colocarmos na janela.
Agora, como notamos então explicamos todas essas funções que estão lá em main e tudo isso iniciado com o excesso indicando que ali funciona a função de biblioteca de glút, exceto as duas funções init e create line. Agora, nessas duas funções utilizamos a função de biblioteca OpenGL em vez de funções da biblioteca de glút adequadamente sua sintaxe são diferentes.
Cada função OpenGL prefixada com o GL como podemos ver nesta função init assim como nessa função de criação de linha. Então, aqui cada função está começando com este prefixo gl, ele indica que esta função é uma função OpenGL. Cada palavra componente dentro do nome da função tem primeira letra capitalizada como aqui C é capitalizada em todos os casos como você pode ver a Matrix M é capitalizada e assim por diante. Sendo assim, essa é a sintaxe da função de biblioteca OpenGL começa com gl e palavra componente dentro deste nome de função tem primeira letra capitalizada.
Às vezes, algumas funções podem exigir um ou mais argumentos que são atribuídos constantes simbólicos. Por exemplo, um nome de parâmetro, valor de parâmetro ou um modo particular, estes são todos parte da sintaxe de função da biblioteca OpenGL.
Agora, todas essas constantes começam com a capital GL toda na capital. Cada componente do nome é escrito em letras maiúsculas e separado por símbolo sublinhado, como vimos no caso de constantes de excesso de glút como o GL ressalta RGB, GL ressalta AMBIENT sublinhado e sublinhado DIFFUSE, onde tudo está em capital separado por sublinhação.
Também as funções OpenGL esperam alguns tipos de dados específicos. Por exemplo, 32 bit inteiro como um valor de parâmetro e essas funções utilizam nomes de tipos de dados integrados para isso.
Cada um desses nomes começa com GL e seguido por nome de tipo de dados. Por exemplo, GLbyte, GLdouble, mas este nome de tipo de dados está em minústrio.
Então, essas são a sintaxe que são usadas para usar funções da biblioteca OpenGL. Agora, vamos tentar entender essas duas funções que definimos usando as funções da biblioteca OpenGL, uma é init, uma é criação de linha. Então, vamos começar com init. Isso é essencialmente significar para inicializar e executar uma configuração de parâmetro de tempo. Em nossa função utilizamos três rotinas de biblioteca OpenGL ou funções de biblioteca. O que eles fazem?
Agora, um é glClearColor, o primeiro com algum argumento, quatro argumentos são usados. Isto é usado para configurar uma cor de fundo para a nossa janela de exibição e esta cor é especificada com componentes RGB.
Agora, esses componentes do RGB são especificados nos três primeiros argumentos nessa ordem que significa que este é R, este é G, este é B, com este conjunto de valores em particular como todos nós sabemos que você vai ficar branco como cor de fundo, podemos configurar qualquer cor de fundo. Por exemplo, se estabelecermos todos os 0, vamos ficar pretos.
Agora, há também um quarto parâmetro que estabelecemos como 0,0. Agora, isso é chamado de valor alfa para a cor especificada e ele é usado como um parâmetro de mistura. Em outras palavras especifica transparência da cor. Se estamos usando o valor 0,0 isso significa que a cor é totalmente transparente e 1,0 significa objetos totalmente opacos. Então, indica transparência.
Agora, aqui estamos exibindo uma linha que é um objeto 2D. No entanto, o OpenGL não trata objetos 2D separadamente. Agora, trata as fotos 2D como caso especial de visualização 3D. Então, essencialmente os estágios inteiros de pipeline 3D são executados.
Sendo assim, precisamos especificar o tipo de projeção e outros parâmetros de visualização que é feito com essas duas funções glMatrixMode, que é GL_PROJECTION e gluOrtho2D com alguns argumentos.
Agora, esta função gluOrtho2D aqui a função é prefixada em GLU em vez de GL. Então, ele indica que essa função pertence ao utilitário GLU ou OpenGL outra biblioteca auxiliar. Mais cedo vimos o toolkit utilitário GLUT OpenGL, agora estamos vendo o utilitário OpenGL outra biblioteca auxiliar.
E esta biblioteca fornece rotinas para tarefas complexas como configuração de matrizes de visualização e projeção, descrevendo objetos complexos com aproximações de linha e polígono, processamento de operações de renderização de superfície e exibição de splines com aproximações lineares, estes são alguns exemplos das tarefas complexas que fazem parte do pipeline que são implementadas nesta biblioteca auxiliar de utilitário OpenGL.
Agora, juntas essas duas funções glMatrixMode e gluOrtho2D especificam uma projeção ortogonal a ser usada para mapear a linha a partir de avião de visualização para a tela. Agora, visualize janela de avião especificada em termos de cantos inferiores esquerdo e superior direito da janela. Então, esses argumentos especificam os cantos inferiores da esquerda e de cima direita da janela e durante esta projeção qualquer coisa fora desta janela é recortada como nós discutimos durante nossa discussão de pipeline.
Agora, vamos mudar para a nossa segunda função criar linha. Agora, essa função é, na verdade, cria a linha que queremos exibir. A primeira linha é glClear com alguns argumentos. Agora, esta função é usada para exibir a janela com cor de fundo especificada. Agora, os argumentos como você pode ver uma constante simbólica OpenGL indica valores de bits em cores ou o buffer de atualização que devem ser configurados para os valores de cores de fundo especificados na função glClearColor da função. Assim, essencialmente esta função indica o que deve ser a cor de fundo da janela de exibição.
Agora, a função OpenGL também nos permite configurar a cor do objeto com a função glColor3f. Então, há três argumentos novamente eles especificam os componentes RGB 'RGB', portanto, essas duas funções são usadas para configurar valores de cor para o plano de fundo, bem como para o objeto.
Agora, na segunda função este 3f indica que os três componentes são especificados usando valores de ponto flutuante. Em outras palavras os valores podem variar entre 0,0 a 1,0. Por isso, neste caso específico esses três valores denotam cor verde.
A seguir temos um pedaço de código entre as duas funções glBegin e glEnd, portanto, isso indica o segmento de linha a ser desenhado entre os terminais fornecidos nos argumentos. Então, essa função cria, basicamente, a linha entre esses dois terminais especificados com esses dois argumentos e as funções glVertex2i chamadas duas vezes.
Agora, aqui este 2i na função como você pode adivinhar indica que os vértices são especificados por dois valores inteiros denotando as coordenadas X e Y, isto é bastante direto.
Agora, o primeiro e o segundo terminais são determinados dependendo de sua ordenação no código. Então, isso sempre será tratado como o primeiro ponto porque ele está aparecendo antes do outro e este será o segundo ponto. Assim, na forma como o código é escrito o primeiro e o segundo pontos são determinados.
E esta função glBegin com esta constante GL_LINES bem como o glEnd de função indicam que os vértices são pontos de ponta de linha.
Agora, com todas essas funções o nosso programa básico de criação de linhas está pronto. Um ponto a ser observado aqui é que essas funções podem ser armazenadas em locais diferentes na memória dependendo da forma como o OpenGL é implementado.
E precisamos forçar o sistema a processar todas essas funções. Isso a gente faz com a outra função glFlush como mostrado aqui. Então, esta deve ser novamente a última linha do nosso procedimento de geração de imagem que indica que todas essas funções que utilizamos devem ser processadas uma após a outra.
Então, é assim que podemos criar um programa usando o OpenGL. Por isso, no nosso exemplo utilizamos a biblioteca OpenGL na configuração de linguagem C e vimos também que apenas a biblioteca OpenGL não é suficiente, precisamos de algumas bibliotecas auxiliares, aqui temos usado GLUT assim como bibliotecas auxiliares GLU, stands GLUT para GL Utility Toolkit que nos permite criar a janela que é uma operação dependente de display e GLU permite executar outras tarefas complexas que não estão lá na biblioteca OpenGL do core.
Então, com isso chegamos ao fim do tópico. Por isso, aprendemos várias coisas, o hardware gráfico incluindo a saída de entrada e GPU, também começamos com uma arquitetura genérica de um sistema gráfico e depois aprendemos sobre vários IO e GPU e hoje aprendemos sobre o software gráfico, como os softwares são criados, padrões diferentes e um programa de exemplo usando OpenGL, o OpenGL pode ser usado para escrever qualquer programa gráfico. Agora, com esta palestra chegamos ao fim do curso. Por isso, na próxima palestra vamos resumir o que aprendemos neste curso até agora.
O que quer que eu tenha discutido hoje podemos encontrar neste livro, você pode passar pelo capítulo 10, seção 10,4 para aprender em Software Gráfico incluindo o exemplo OpenGL. Por isso, na última palestra vamos resumir nosso aprendizado até o momento, por isso vamos vê-lo na palestra concluindo, até então obrigado e adeus.