Pergunta

Em ++ OpenGL C, quero chamar cada pixel manualmente (como uma textura Presumo) para um simples quadrados primitivos, ou mesmo 2 polígonos formando um quadrado.

Eu não tenho idéia por onde começar, ou que frases que procurar. Estou olhando para a textura de mapeamento ou criar texturas? A maioria dos exemplos são a carga de um arquivo, mas eu não quero fazer isso.

Eu tentei ler o meu OpenGL livro Programming Guide, mas a sua apenas um labirinto como eu sou muito novo para OpenGL. Por favor, ajuda.

Foi útil?

Solução

Dê uma olhada de perto glTexImage2D. Esta é a chamada que carrega a imagem em OpenGL para uma textura 2D.

glTexImage2D realmente leva um ponteiro bruto para os dados de pixel da imagem. Você pode alocar memória mesmo, e defina os dados de imagem diretamente (como quiser), em seguida, chamar essa função para passar a imagem para OpenGL.

Depois de criar a textura, você pode vinculá-lo ao estado para que seus triângulos usar essa textura.

Não há nada em OpenGL que requer diretamente imagens utilizadas como texturas para ser carregado a partir de arquivos. Um bom recurso para texturas pode ser encontradas neste artigo GameDev.

Outras dicas

Se o quadrado que você está desenhando a é 2 dimensional e não girado, você pode estar à procura de glDrawPixels . Ele permite que você desenhe uma região retangular de pixels diretamente para o buffer sem o uso de polígonos.

Se você é novo, então eu recomendo a partir de um tutorial sobre de NeHe .

Do nota que, enquanto glTexImage2D() leva um ponteiro para os pixels de carga, ele não se preocupa com quaisquer alterações a esses dados após a chamada. Ou seja, os dados são realmente carregado na área de memória que você especificar, e OpenGL cria uma cópia do seu próprio.

Isto significa que se as alterações de dados, você terá que quer voltar a fazer a chamada glTexImage2D (), ou usar algo como glTexSubImage2D() fazer uma atualização parcial. Eu recomendaria testes e criação de perfil para ver se sub-textura atualização é rápida, não tenho certeza como os motoristas real otimizar para esse caso.

Graças à Reed Copsey para me apontando para glTexImage2D . Acontece que este é muito simples; apenas passar uma matriz de GLubyte para a função glTexImage2D (bem como todas as funções necessárias para se ligar a textura, etc). Não tentei esse trecho exata do código, mas ele deve funcionar bem. Os elementos da matriz representam uma versão de série das linhas, colunas e canais.

int pixelIndex = 0;
GLubyte pixels[400];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; x++)
    {
         for (int channel = 0; channel < 4; channel++)
         {
             // 0 = black, 255 = white
             pixels[pixelIndex++] = 255;
         }
    }
}

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, pixels);

Eu li no livro OpenGL você pode usar uma matriz 2D para imagens monocromáticas, então eu suponho que você poderia usar uma matriz 3D também.

O que você está procurando é geralmente chamado de "render à textura."

http://developer.nvidia.com/object/gdc_oglrtt.html

Esse tutorial é bastante antiga. Eu acho que algumas dessas extensões não são extensões em versões mais recentes do OGL. Desculpe, não posso ser de mais ajuda. Eu não trabalho diretamente com gráficos API é muito mais, e se eu tivesse Eu usar D3D se eu poderia (para evitar a sopa de extensão, e por outras razões que eu não vou te aborrecer com aqui.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top