Цветовое отображение текстуры в opengl

Я показываю текстуру, которой хочу манипулировать, не затрагивая данные изображения. Я хочу иметь возможность фиксировать значения текселей так, чтобы все, что ниже нижнего значения, становилось равным 0, все, что выше верхнего значения, становилось 0, а все, что между ними, линейно отображалось от 0 до 1.

Первоначально для отображения моего изображения я использовал glDrawPixels. И чтобы решить проблему выше, я бы создал карту цветов, используя glPixelMap. Это сработало прекрасно. Однако из соображений производительности я начал использовать текстуры для отображения своего изображения. Подход glPixelMap больше не работает. Ну, этот подход может работать, но я не смог заставить его работать.

Затем я попытался использовать glPixelTransfer для установки масштаба и смещения». Это, казалось, имело какой-то эффект (не обязательно желаемый) при первом проходе, но когда верхние и нижние ограничения были изменены, никакого эффекта не было видно.

Затем мне сказали, что фрагментные шейдеры будут работать. Но после вызова glGetString(GL_EXTENSIONS) я обнаружил, что GL_ARB_fragment_shader не поддерживается. Кроме того, вызов glCreateShaderObjectARB вызывает исключение nullreferenceException.

Так что теперь я в растерянности. Что я должен делать? Пожалуйста помоги.


Что когда-либо может сработать, я готов попробовать. Поставщик — Intel, а средство визуализации — Intel 945G. К сожалению, я ограничен графической картой, встроенной в материнскую плату, и имеет только gl 1.4.

Спасибо за ваш ответ.


person Dan Vogel    schedule 24.10.2008    source источник


Ответы (3)


Если у вас нет довольно старой видеокарты, то удивительно, что у вас нет поддержки фрагментных шейдеров. Я бы посоветовал вам перепроверить, используя это.

Кроме того, вы уверены, что хотите, чтобы все, что выше максимального значения, было равно 0? Возможно, вы имели в виду 1? Если вы имели в виду 1, а не 0, то это довольно многословные способы сделать то, что вы просите.

Сжатый ответ заключается в том, что вы используете несколько проходов рендеринга. Сначала вы визуализируете изображение с нормальной интенсивностью. Затем вы используете вычитающее смешивание (ищите glBlendEquation), чтобы вычесть минимальное значение. Затем вы используете аддитивное смешивание, чтобы умножить все на 1/(max-min) (для чего может потребоваться несколько проходов).

Если вы действительно хотите это сделать, отправьте обратно GL_VENDOR и GL_RENDERER для вашей видеокарты.

Редактировать: Хм. У Intel 945G нет ARB_fragment_shader, но есть ARB_fragment_program, что тоже поможет.

Ваш код-фрагмент должен выглядеть примерно так (но я давно ничего не писал, поэтому, вероятно, он содержит ошибки)

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

Вы загружаете это в OpenGL следующим образом:

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

Затем, перед визуализацией вашей геометрии, вы делаете следующее:

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);
person Menkboy    schedule 24.10.2008

Также проверьте, поддерживается ли расширение GL_ARB_fragment_program. Это расширение поддерживает фрагментные программы в стиле ASM. Предполагается, что это поддерживается в OpenGL 1.4.

person Corey Ross    schedule 24.10.2008
comment
GL_ARB_fragment_program поддерживается. - person Dan Vogel; 25.10.2008

Очень жаль, что вы используете такую ​​древнюю версию OpenGL. Можете ли вы обновить с вашей карты?

Для более современного OGL 2.x это именно та программа, для которой предназначен GLSL. Отличную документацию можно найти здесь:

Документация по OpenGL

Язык затенения OpenGL

person Larry Gritz    schedule 25.10.2008
comment
если он говорит, что он ограничен 1.4, он ограничен 1.4. Искушать его чем-то, чего он не может иметь, просто подло. - person mmr; 09.12.2008