Вопрос

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

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

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

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

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


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

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

Это было полезно?

Решение

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

Кроме того, вы уверены, что хотите, чтобы значение, превышающее максимальное значение, было равно 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);

Другие советы

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

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

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

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

Язык шейдеров OpenGL

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top