То, что вы там делаете, относится к фрагментному шейдеру, а не к вершинному шейдеру.И вы отправляете таблицу соответствия цветов и данные спектральной плотности в виде текстуры.Хотя установка вершин не стоит , что стоит , она сопряжена с определенными накладными расходами, и, как правило, вы хотите покрыть как можно больше пикселей с наименьшим возможным числом вершин.
Также изучите правила вычисления логарифма (например, log(a/b) = log(a) - log(b)
) и избегайте выполнения расчетов, которые являются единообразными по всему вызову отрисовки и предварительно рассчитываются на хосте.
/* vertex shader */
#version 130
varying vec2 pos;
void main() {
// set vertex position based on its ID
// To fill the viewport, we need just three vertices
// of a rectangular triangle of with and height 2
pos.x = gl_VertexID % 2;
pos.y = gl_VertexID / 2;
// screen position is controlled using glViewport/glScissor
gl_Position = vec4(2*pos, 0, 1.0);
}
-
/* fragment shader */
#version 130
varying vec2 pos;
uniform sampler2D values;
uniform sampler1D colors;
uniform float log_min;
uniform float log_max;
void main() {
float val = texture2D(values, pos).x;
float e = log_max - log_min;
float d = (log(val) - log_min) / e;
gl_FragColor = vec4(texture1D(colors, d).rgb, 1.0); // set color
}
В более поздних версиях GLSL некоторые ключевые слова имеютизменилось.Изменения определяются с использованием in
и out
вместо varying
, а функции доступа к текстуре были объединены для охвата всех типов сэмплеров.
glsl_program.bind();
glsl_program.setUniformValue(vshader_log_max_uniform, log(max_val));
glsl_program.setUniformValue(vshader_log_min_uniform, log(min_val));
// specify where to draw in window pixel coordinates.
glEnable(GL_SCISSOR_TEST);
glViewport(x, y, width, height);
glScissor(x, y, width, height);
glBindTexture(GL_TEXTURE_2D, values_texture);
glTexSubImage2D(GL_TEXTURE_2D, ..., spectral_density_data);
glDrawArrays(GL_TRIANGLES, 0, 3);
glsl_program.release();