Pregunta

Estoy mostrando una textura que quiero manipular sin afectar los datos de la imagen. Quiero poder sujetar los valores de texel para que todo lo que esté por debajo del valor más bajo se convierta en 0, todo lo que esté por encima del valor más alto se convierta en 0, y todo lo que esté entre ambos se asigna linealmente de 0 a 1.

Originalmente, para mostrar mi imagen estaba usando glDrawPixels. Y para resolver el problema anterior, crearía un mapa de color usando glPixelMap. Esto funcionó muy bien. Sin embargo, por razones de rendimiento, comencé a usar texturas para mostrar mi imagen. El enfoque glPixelMap ya no parece funcionar. Bueno, ese enfoque puede funcionar, pero no pude hacerlo funcionar.

Luego intenté usar glPixelTransfer para establecer escalas y sesgos '. Esto parecía tener algún tipo de efecto (no necesariamente el deseado) en la primera pasada, pero cuando se modificaron las restricciones superior e inferior no se observó ningún efecto.

Entonces me dijeron que los fragment shaders funcionarían. Pero después de una llamada a glGetString (GL_EXTENSIONS), descubrí que GL_ARB_fragment_shader no era compatible. Además, una llamada a glCreateShaderObjectARB causa una excepción de referencia nula.

Así que ahora estoy perdido. ¿Qué tengo que hacer? Por favor ayuda.


Lo que pueda funcionar estoy dispuesto a intentarlo. El proveedor es Intel y el procesador es Intel 945G. Desafortunadamente, estoy confinado a una tarjeta gráfica que está integrada en la placa base, y solo tiene gl 1.4.

Gracias por su respuesta hasta ahora.

¿Fue útil?

Solución

A menos que tenga una tarjeta gráfica bastante antigua, es sorprendente que no tenga soporte para sombreador de fragmentos. Le sugiero que intente realizar una doble verificación con this .

Además, ¿está seguro de que desea que cualquier valor por encima del valor máximo sea 0? Tal vez quisiste decir 1? Si quisiste decir 1 y no 0, entonces hay formas bastante largas de hacer lo que estás pidiendo.

La respuesta condensada es que utiliza varias pasadas de representación. Primero se renderiza la imagen a intensidad normal. Luego, utiliza la combinación sustractiva (buscar glBlendEquation) para restar su valor mínimo. Luego utiliza la mezcla aditiva para multiplicar todo por 1 / (máximo-mínimo) (que puede necesitar varios pases).

Si realmente quieres hacer esto, vuelve a publicar el GL_VENDOR y GL_RENDERER para tu tarjeta gráfica.

Editar: Hmm. Intel 945G no tiene ARB_fragment_shader , pero tiene ARB_fragment_program que también hará el truco.

El código de tu fragmento debería tener un aspecto similar a este (pero ha pasado un tiempo desde que escribí algo, por lo que es probable que esté dañado)

!!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 

Usted carga esto en OpenGL así:

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);

Luego, antes de renderizar su geometría, haga esto:

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);

Otros consejos

También vea si la extensión GL_ARB_fragment_program es compatible. Esa extensión es compatible con los programas de fragmentos de estilo ASM. Se supone que eso es compatible con OpenGL 1.4.

Es realmente desafortunado que estés usando una versión tan antigua de OpenGL. ¿Se puede actualizar con su tarjeta?

Para un OGL 2.x más moderno, este es exactamente el tipo de programa para el que está diseñado GLSL. Gran documentación se puede encontrar aquí:

Documentación de OpenGL

Lenguaje de sombreado de OpenGL

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top