Это потому, что ваш GL_RED
формат текстуры ограничен диапазоном <0,1>
!!!
Чтобы исправить это, вам нужно использовать нефиксированный формат текстуры или отключить фиксацию ... Вот примеры, которые работают над моими реализациями GL:
здесь форматы извлекаются из обоих:
glTexImage3D(GL_TEXTURE_3D, 0, GL_R16F, xs,ys,zs, 0, GL_RED, GL_FLOAT, dat);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, size, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, pdata);
Для скалярных данных я бы использовал первый вариант. Есть больше форматов, которые не зажаты, просто попробуйте и посмотрите ...
Я никогда не использовал отключение функции фиксации, но где-то видел этот код при исследовании подобных проблем (не уверен, работает ли он):
glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);
Теоретически вы можете использовать любой формат текстур ...
Для проверки вы можете использовать это:
Также я не вижу никаких параметров набора текстур. Я бы ожидал что-то вроде этого:
glBindTexture(GL_TEXTURE_3D,txrvol);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
, чтобы избежать неправильной интерполяции ваших данных из-за неточных координат текстуры ...