Russian Qt Forum
Ноябрь 22, 2024, 11:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Реквестирую выпрямление рук по работе с шейдерами  (Прочитано 4367 раз)
ibnz
Гость
« : Май 12, 2015, 15:39 »

Пробую написать простенький фрагментный шейдер, смешивающий несколько текстурок. И никак не пойму как получить доступ к нескольким сэмплерам одновременно. Что бы я не подпихивал в

setUniformValue("tex*", *); (стр. 83-90)

все сэмплеры работают только с той текстурой которую забиндили в нулевой слот.

Что я не так делаю?

Код:
#include <QApplication>
#include <QCoreApplication>
#include <QOffscreenSurface>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QOpenGLFramebufferObject>
#include <QOpenGLShader>
#include <QOpenGLTexture>
#include <QLabel>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSurfaceFormat format;
    format.setMinorVersion( 2 );
    format.setMajorVersion( 4 );
    format.setProfile( QSurfaceFormat::CompatibilityProfile );
//    format.setProfile( QSurfaceFormat::CoreProfile );

    QOpenGLContext context;
    context.setFormat(format);
    if(!context.create()){        
        qFatal("Cannot create the requested OpenGL context!");
    }

    QOffscreenSurface surface;
    surface.setFormat( format );
    surface.create();
    context.makeCurrent( &surface );

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    const float c_01SquareVertices[8] ={0.0f, 0.0f,
                                        1.0f, 0.0f,
                                        1.0f, 1.0f,
                                        0.0f, 1.0f};
    glVertexPointer(2, GL_FLOAT, 0, c_01SquareVertices);
    glTexCoordPointer(2, GL_FLOAT, 0, c_01SquareVertices);
    glDisable(GL_DEPTH_TEST);
//    glEnable(GL_TEXTURE_2D);

    QImage texImg = QImage(":/tex/tex");
    QOpenGLTexture tex(texImg.mirrored());
    QImage texImg1 = QImage(":/tex/tex1");
    QOpenGLTexture tex1(texImg1.mirrored());
    QImage texImg2 = QImage(":/tex/tex2");
    QOpenGLTexture tex2(texImg2.mirrored());

    QString fsc =
            "uniform sampler2D tex;"
            "uniform sampler2D tex1;"
            "uniform sampler2D tex2;"
            "varying vec4 gl_TexCoord[];"
            "void main(void)"
            "{"
            "   gl_FragColor = texture2D(tex, gl_TexCoord[0].yx * 2.0);"
//            "   gl_FragColor = texture2D(tex1, gl_TexCoord[0].xy) + texture2D(tex2, gl_TexCoord[0].xy);"
            "}";

    QOpenGLShader fsh( QOpenGLShader::Fragment, &context );
    fsh.compileSourceCode( fsc );

    QOpenGLShaderProgram pr( &context );

    pr.addShader( &fsh );
    pr.link();

    QOpenGLFramebufferObjectFormat fboFormat;
//    fboFormat.setInternalTextureFormat(GL_ALPHA32F);
    QOpenGLFramebufferObject fbo( 1000, 1000, fboFormat );
    fbo.bind();
        glViewport(0,0,1000,1000);
        glClear(GL_COLOR_BUFFER_BIT);

        tex.bind(0);
        pr.setUniformValue("tex", 1);

        tex1.bind(2);
        pr.setUniformValue("tex1", 2);

        tex2.bind(3);
        pr.setUniformValue("tex2", 3);

        pr.bind();

        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    fbo.release();

    QLabel w;
    w.resize(fbo.size());
    w.setPixmap(QPixmap::fromImage(fbo.toImage()));
    w.show();

    return a.exec();
}

Кстати вдогонку еще впросик сугубо кутешный: В примерах (qml ных) активно используется вместо
"varying vec4 gl_TexCoord[];"
такой зверь:

varying vec2 qt_TexCoord0;

Но у меня он никак не заводится. Что это и почему у меня не работает?
gl_TexCoord говорят deprecated будет...

Если понадобится целиковый тестовый проект доступен тут https://bitbucket.org/ibnz/shadertest
« Последнее редактирование: Май 12, 2015, 15:52 от ibnz » Записан
ibnz
Гость
« Ответ #1 : Май 12, 2015, 17:39 »

Сам спросил - сам отвечаю) Биндить программу надо до установки значений. Первый вопрос вопрос закрыт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 21.