Неправильные значения попадают в GLSL Frag Shader

Я работаю над тем, что должно быть простым проектом OpenGl 4. Все, что я хочу сделать, это изменить альфа-значение вокруг указателя мыши и смешать. После некоторой работы мне удалось получить круг для изменения значений, но он статичен (не перемещается с помощью мыши) и центрирован на (0,512), а не на месте моей мыши. Я отправляю значения мыши через свойpassiveMotionFunc:

void
motion ( int x, int y)
{
    MousePos.x = x;
    MousePos.y = y;
    printf("x=%i\ny=%i\n\n", x, y);
    glUniform2fv(glGetUniformLocation(program, "MousePos"), 2, MousePos);
    glutPostRedisplay();
}

Где MousePos — это просто контейнер с плавающей запятой. У меня есть оператор печати, чтобы я мог видеть значения моего местоположения мыши.

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

in  vec4 color;
in  vec4 vPosition;
in vec2 MousePos;
out vec4 fColor;

void
main()
{
        //float x = gl_FragCoord.X;
        //float y = gl_FragCoord.Y;
        float distance = sqrt(pow(MousePos.x-gl_FragCoord.x, 2) + pow(MousePos.y-gl_FragCoord.y, 2));
        if(distance > 30)
            fColor = color;
        else{
            float a = .1;
            fColor = color;
            fColor.a = a;
        }
}

Я абсолютно застрял на этом. Я предполагаю, что фраг-шейдер не получает обновленные координаты мыши, потому что, если бы FragCoord был испорчен, он не создавал бы круг.

РЕДАКТИРОВАТЬ: я настроил свое смешивание в функции init(), которая предшествует моим glutDisplay и glutPassiveFunc в main().

void
init()
{
    wall();
    redwall();
    // Create a vertex array object
    GLuint vao;
    glGenVertexArrays( 1, &vao );
    glBindVertexArray( vao );

    // Create and initialize a buffer object
    GLuint buffer;
    glGenBuffers( 1, &buffer );
    glBindBuffer( GL_ARRAY_BUFFER, buffer );
    glBufferData( GL_ARRAY_BUFFER, sizeof(points) + sizeof(quad_colors), NULL, GL_STATIC_DRAW );

    glBufferSubData( GL_ARRAY_BUFFER, 0, sizeof(points), points );

    glBufferSubData( GL_ARRAY_BUFFER, sizeof(points), sizeof(quad_colors), quad_colors );


    // Load shaders and use the resulting shader program
    program = InitShader( "p6v.glsl", "p6f.glsl" );
    glUseProgram( program );

    // set up vertex arrays
    GLuint vPosition = glGetAttribLocation( program, "vPosition" );
    glEnableVertexAttribArray( vPosition );
    glVertexAttribPointer( vPosition, 4, GL_FLOAT, GL_FALSE, 0,
               BUFFER_OFFSET(0) );

    GLuint vColor = glGetAttribLocation( program, "vColor" ); 
    glEnableVertexAttribArray( vColor );
    glVertexAttribPointer( vColor, 4, GL_FLOAT, GL_FALSE, 0,
               BUFFER_OFFSET(sizeof(points)) );

    //glEnable(GL_DEPTH_TEST);
    glEnable( GL_BLEND );
    glEnable( GL_ALPHA_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDepthMask(false);

    glClearColor( 0.0, 0.5, 1.0, 1.0 );
}

EDIT2: Вот мое определение vec2:

struct vec2 {

    GLfloat  x;
    GLfloat  y;

    //
    //  --- Constructors and Destructors ---
    //

    vec2( GLfloat s = GLfloat(0.0) ) :
    x(s), y(s) {}

    vec2( GLfloat x, GLfloat y ) :
    x(x), y(y) {}

    vec2( const vec2& v )
    { x = v.x;  y = v.y;  }

    //
    //  --- Indexing Operator ---
    //

    GLfloat& operator [] ( int i ) { return *(&x + i); }
    const GLfloat operator [] ( int i ) const { return *(&x + i); }

    //
    //  --- (non-modifying) Arithematic Operators ---
    //

    vec2 operator - () const // unary minus operator
    { return vec2( -x, -y ); }

    vec2 operator + ( const vec2& v ) const
    { return vec2( x + v.x, y + v.y ); }

    vec2 operator - ( const vec2& v ) const
    { return vec2( x - v.x, y - v.y ); }

    vec2 operator * ( const GLfloat s ) const
    { return vec2( s*x, s*y ); }

    vec2 operator * ( const vec2& v ) const
    { return vec2( x*v.x, y*v.y ); }

    friend vec2 operator * ( const GLfloat s, const vec2& v )
    { return v * s; }

    vec2 operator / ( const GLfloat s ) const {
#ifdef DEBUG
    if ( std::fabs(s) < DivideByZeroTolerance ) {
        std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
              << "Division by zero" << std::endl;
        return vec2();
    }
#endif // DEBUG

    GLfloat r = GLfloat(1.0) / s;
    return *this * r;
    }

    //
    //  --- (modifying) Arithematic Operators ---
    //

    vec2& operator += ( const vec2& v )
    { x += v.x;  y += v.y;   return *this; }

    vec2& operator -= ( const vec2& v )
    { x -= v.x;  y -= v.y;  return *this; }

    vec2& operator *= ( const GLfloat s )
    { x *= s;  y *= s;   return *this; }

    vec2& operator *= ( const vec2& v )
    { x *= v.x;  y *= v.y; return *this; }

    vec2& operator /= ( const GLfloat s ) {
#ifdef DEBUG
    if ( std::fabs(s) < DivideByZeroTolerance ) {
        std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
              << "Division by zero" << std::endl;
    }
#endif // DEBUG

    GLfloat r = GLfloat(1.0) / s;
    *this *= r;

    return *this;
    }

    //
    //  --- Insertion and Extraction Operators ---
    //

    friend std::ostream& operator << ( std::ostream& os, const vec2& v ) {
    return os << "( " << v.x << ", " << v.y <<  " )";
    }

    friend std::istream& operator >> ( std::istream& is, vec2& v )
    { return is >> v.x >> v.y ; }

    //
    //  --- Conversion Operators ---
    //

    operator const GLfloat* () const
    { return static_cast<const GLfloat*>( &x ); }

    operator GLfloat* ()
    { return static_cast<GLfloat*>( &x ); }
};

person Tubbs    schedule 14.04.2012    source источник
comment
Ты что-нибудь делаешь с альфой? Где ваша настройка смеси?   -  person Nicol Bolas    schedule 14.04.2012
comment
Откуда вы знаете, что mouseCoord передан неправильно? Попробуйте поместить фрагмент с каким-либо цветом в mouseCoord и посмотрите, появляется ли он в нужных координатах. Можете ли вы также показать, что такое тип MouseCoord? Кажется, это не просто массив.   -  person victor.t    schedule 14.04.2012
comment
Я добавил в свое определение vec2. Раньше таких проблем не было. Я добавил: if ( MousePos.x == gl_FragCoord.x && MousePos.y == gl_FragCoord.y){ fColor = vec4(0.0, 1.0, 0.0, 1.0); } к моему фрагментарному шейдеру и не увидел разницы. честно говоря, даже если бы он и появился, он был бы под мышкой.   -  person Tubbs    schedule 14.04.2012
comment
Вы пытались посмотреть с помощью gDebugger, он должен показать вам единые параметры, которые вы передаете gremedy.com   -  person victor.t    schedule 15.04.2012


Ответы (1)


Вам нужно объявить MousePos как uniform, чтобы передать его как один. В вашем фрагментном шейдере он объявлен как "in".

Также вы используете векторную универсальную загрузку glUniform2fv для загрузки из экземпляра класса vec2 MousePos. Вы должны загрузить это в форме с двумя аргументами glUniform2f. Форма glUniform2fv ищет аргумент, который является указателем на блок из 2 значений с плавающей запятой в качестве последнего аргумента. Вы передаете его MousePos туда, который является фактическим экземпляром класса, и вы рассчитываете, что ваши операторы приведения сделают эту работу.

person Michael Daum    schedule 14.04.2012
comment
glUniform2fv не подходит для вашего vec2. Используйте glUniform2f(mouseposloc, MousePos.x, MousePos.y); - person Michael Daum; 15.04.2012