Цветовое наложение текстуры в opengl - PullRequest
2 голосов
/ 24 октября 2008

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

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

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

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

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


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

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

Ответы [ 3 ]

2 голосов
/ 25 октября 2008

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

Кроме того, вы уверены, что хотите, чтобы максимальное значение было равно 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);
0 голосов
/ 26 октября 2008

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

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

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

OpenGL Shading Langauge

0 голосов
/ 25 октября 2008

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

...