OpenGL: Как создать текстуру цветовой карты?

создание экземпляра colorMap:

GLfloat colormapColors[16];

вот мои данные цветовой карты:

colormapColors[0] =  0.0f; // black
colormapColors[1] =  0.0f;
colormapColors[2] =  0.0f;
colormapColors[3] =  0.0f;

colormapColors[4] =  0.0f; // blue
colormapColors[5] =  0.0f;
colormapColors[6] =  1.0f;
colormapColors[7] =  0.0f;

colormapColors[8] =  1.0f; // red
colormapColors[9] =  0.0f;
colormapColors[10] = 0.0f;
colormapColors[11] = 0.0f;

colormapColors[12] = 1.0f; // white
colormapColors[13] = 1.0f;
colormapColors[14] = 1.0f;
colormapColors[15] = 1.0f;

в моем цикле рендеринга у меня есть

glGenTextures(1, &texture); // get texture id
glBindTexture(GL_TEXTURE_1D, texture);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 4, 0, GL_RGBA, GL_FLOAT, colormapColors);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // linear interpolation when too small
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // linear interpolation when too bi
glErrorCheck;

фрагментный шейдер:

vec4 color = texture(ourTexture, clamp(alpha,0.0,1.0));
gl_FragColor = vec4(color.r, color.g, color.b, 1.0);

альфа рассчитывается по расстоянию до центра, и я получаю:

плохая точка

Итак, ясно, что у нас есть черный, синий, красный, белый. Не должно быть серого. Я думаю, что это проблема выравнивания данных. Я неправильно делаю glTexImage1D?


person Elan Hickler    schedule 09.03.2017    source источник


Ответы (1)


Вам нужно добавить glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE), чтобы тексели ребер не смешивались с текселями на другой стороне.

Вы также можете зафиксировать значение альфа-канала в центре текселя ([1/texSize;1-1/texSize]), просто чтобы продемонстрировать, как работает интерполяция текселей.

person pleluron    schedule 10.03.2017
comment
Спасибо за ответ! Я добавил gltexparameteri, как вы сказали, и это приблизило меня к правильным результатам, но это не совсем работает. Как зафиксировать значение альфа-канала в центре текселя? Где мне это применить? [1/texSize;1-1/texSize] - person Elan Hickler; 10.03.2017
comment
Как это "не совсем работает"? Пожалуйста, дайте более подробную информацию. - person pleluron; 11.03.2017
comment
Мой альфа-канал был 1.0, поэтому смешивание не происходило, когда я рисовал много кругов. - person Elan Hickler; 12.03.2017
comment
Вы использовали glEnable(GL_BLEND) и glBlendFunc()? - person pleluron; 13.03.2017