2013-06-14 2 views
1

Мне было интересно, если бы я мог обработать буферы текстур OpenGL, чтобы буфер оттенков серого преобразовывался в значения rgb на лету через какую-то формулу по моему выбору.Яркость от OpenGL до цветного отображения?

У меня уже есть функция, которая хорошо работает, но выводит цвет 3 вектора.

rgb convertToColor(float value); 

Я новичок в OpenGL, и было интересно, какой шейдер я должен использовать, и где она должна идти. Моя программа в настоящее время циклы кадры, как например:

program1.bind(); 
program1.setUniformValue("texture", 0); 
program1.enableAttributeArray(vertexAttr1); 
program1.enableAttributeArray(vertexTexr1); 
program1.setAttributeArray(vertexAttr1, vertices.constData()); 
program1.setAttributeArray(vertexTexr1, texCoords.constData()); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,widthGL,heightGL, GL_LUMINANCE,GL_UNSIGNED_BYTE, &displayBuff[displayStart]); 
glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 
glBindTexture(GL_TEXTURE_2D,0); 
//... 

Shader

QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this); 
    const char *fsrc1 = 
     "uniform sampler2D texture;\n" 
     "varying mediump vec4 texc;\n" 
     "void main(void)\n" 
     "{\n" 
     " gl_FragColor = texture2D(texture, texc.st);\n" 
     "}\n"; 

Я пытаюсь воссоздать эффекты в MATLAB, как imagesc, как видно, например, на изображении ниже: imagesc

ответ

6

Что-то, как это будет работать:

"uniform sampler2D texture;\n" 
    "uniform sampler1D mappingTexture;\n" 
    "varying mediump vec4 texc;\n" 
    "void main(void)\n" 
    "{\n" 
    " gl_FragColor = texture1D(mappingTexture, texture2D(texture, texc.st).s);\n" 
    "}\n"; 

, где отображение текстур является 1D textuer, которая отображает оттенки серого в цвет.

Конечно, вы также можете написать функцию, которая вычисляет цвет rgb на основе оттенков серого, но (в зависимости от вашего оборудования) может быть быстрее просто выполнить поиск текстуры.

не ясно, как связать два буфера в программу OpenGL сразу

Binding textures to samplers.

+0

Это хороший ответ, но я нахожу кривые обучения невероятно крутым. – Mikhail

+0

@Mikhail: попробуйте прочитать так называемую «OpenGL Orange book» -> «OpenGL shading language 3rd edition». Это должно помочь вам лучше понять шейдеры. – SigTerm

+0

Например, неясно, как сразу привязать два буфера к программе OpenGL. – Mikhail

1

Это выглядит например, у вас уже есть программа, загруженная и настроенная для чтения текстуры (program1 в вашем коде). Предполагая, что вершинный шейдер уже настроен для передачи координат текстуры пиксельных шейдеров, чтобы посмотреть в текстуру (в приведенной ниже программе это «texcoord»), вы должны иметь возможность изменить пиксельный шейдер на что-то вроде этого:

uniform texture2d texture; // this is the greyscale texture 
varying vec2 texcoord;  // passed from your vertex shader 

void main() 
{ 
    float luminance = tex2D(texture, texcoord).r;  // grab luminance texture 
    gl_FragColor = convertToColor(luminance);   // run your function 
} 

это читается в текстуре яркости и вызывает вашу функцию, которая преобразует яркость в цвет. если ваша функция возвращает только 3-компонентный RGB вектор, вы можете изменить последнюю строку на:

gl_FragColor = vec4(convertToColor(luminance), 1.0); 
Смежные вопросы