Pergunta

Eu estou exibindo uma textura que eu quero para manipular sem fora afetar os dados de imagem. Queira ser capaz de prender os valores texel de modo que qualquer coisa abaixo do valor inferior torna-se 0, qualquer coisa acima do valor superior torna-se 0, e qualquer coisa entre linearmente é mapeado a partir de 0 a 1.

Originalmente, para exibir minha imagem eu estava usando glDrawPixels. E para resolver o problema acima eu iria criar um mapa de cores usando glPixelMap. Isso funcionou muito bem. No entanto, por motivos de desempenho I começaram a usar texturas para exibir minha imagem. A abordagem glPixelMap não parece trabalho. Bem que a abordagem pode funcionar, mas eu era incapaz de fazê-lo funcionar.

Então eu tentei usando glPixelTransfer para escalas definidas e preconceito. Este parecia ter algum tipo de efeito (não necessariamente o desejado) na primeira passagem, mas quando as limitações superiores e inferiores foram alteradas nenhum efeito foi visível.

I foi então disse que shaders de fragmentos iria funcionar. Mas depois de uma chamada para glGetString (GL_EXTENSIONS), descobri que GL_ARB_fragment_shader não era suportado. Além disso, uma chamada para glCreateShaderObjectARB causa um NullReferenceException.

Então agora eu estou em uma perda. O que devo fazer? Por favor, ajuda.


O que nunca pode funcionar Estou disposto a tentar. O fornecedor é Intel e o processador é Intel 945G. Estou, infelizmente, confinado a uma placa gráfica que está integrado na placa-mãe, e só tem gl 1.4.

Obrigado por sua resposta até agora.

Foi útil?

Solução

A menos que você tem uma placa gráfica muito velho, é surpreendente que você não tem suporte fragmento de shader. Eu sugiro que você tente duplo controlo usando este .

Além disso, você tem certeza que quer qualquer coisa acima do valor máximo a ser 0? Talvez você quis dizer 1? Se você fez média 1 e não 0, em seguida, são formas bastante prolixo para fazer o que você está pedindo.

A resposta condensada é que você use vários renderização de passes. Primeiro você processar a imagem em intensidade normal. Então você usa mistura subtrativo (olhar para cima glBlendEquation) para subtrair o valor mínimo. Então você usa mistura aditivo a tudo multiplicam-se por 1 / (max-min) (que pode precisar de vários passes).

Se você realmente quer fazer isso, por favor enviar de volta o GL_VENDOR e GL_RENDERER para sua placa gráfica.

Editar: Hmm. Intel 945G não tem ARB_fragment_shader, mas tem ARB_fragment_program que também irá fazer o truque.

O fragmento de código deve ser algo como isto (mas tem sido um tempo desde que eu escrevi qualquer por isso é provavelmente grampeado)

!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color

TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale

END 

Você carrega isso em OpenGL assim:

GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);

Então, antes de processar a geometria, você fazer isso:

glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);

//Draw your textured geometry

glDisable(GL_FRAGMENT_PROGRAM_ARB);

Outras dicas

Também ver se a extensão GL_ARB_fragment_program é suportado. Essa extensão é compatível com os programas de fragmento estilo ASM. Que é suposto ser suportado em OpenGL 1.4.

É realmente lamentável que você está usando uma versão tão antiga de OpenGL. você pode atualizar com o seu cartão?

Para um 2.x OGL mais moderno, este é exatamente o tipo de programa que GLSL é para. Grande documentação pode ser encontrada aqui:

OpenGL Documentação

OpenGL Shading Langauge

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