2012-04-14 12 views
0

私は単純なOpenGl 4プロジェクトにすべきことに取り組んでいます。私がしようとしているのは、マウスポインタの周りのアルファ値を変更してブレンドすることだけです。いくつかの作業の後、値を変更するためにサークルを取得することができましたが、静的(マウスで動かない)で、マウスの位置はほとんどありません(0,512)。マウスの値を私のpassiveMotionFuncを通して送信します。GLSL Frag Shaderに間違った値があります

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は単純なフロートコンテナです。私は私のマウスの位置の値を見ることができるようにprintステートメントを持っています。

私のフラグ・シェーダは単純です:

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がうんざりしている場合、円を生成しないので、フラグシェーダが更新されたマウス座標を取得していないと仮定しています。

EDIT:メイン()のglutDisplayとglutPassiveFuncに先行するinit()関数でブレンドを設定しました。

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); } 
}; 
+0

アルファで何かしていますか?あなたのブレンド設定はどこですか? –

+0

mouseCoordが正しく転送されなかったことをどのように知っていますか? mouseCoordで色分けして、必要な座標に表示されているかどうかを確認してください。 MouseCoordのタイプを表示することはできますか?それはちょうど配列のようではありません。 –

+0

vec2の定義に追加しました。このような問題はこれまでに発生していません。私が追加: (MousePos.x == gl_FragCoord.x && MousePos.y == gl_FragCoord.y){ \t \t \t FCOLOR = vec4(0.0、1.0、0.0、1.0)であれば、 \t \t \t} 私のfragシェーダに違いは見られませんでした。しかし、たとえそれが現れても、それはマウスの下にあるでしょう。 – Tubbstosterone

答えて

1

あなたは一人としてそれを渡すためにuniformようMousePosを宣言する必要があります。フラグメントシェーダは、 "in"として宣言しています。

また、ベクター一様アップロードglUniform2fvを使用して、vec2クラスインスタンスのMousePosから読み込みます。これを2-arg形式のglUniform2fにロードしてください。 glUniform2fvフォームは、最後の引数として2つの浮動小数値のブロックへのポインタである引数を探しています。そこに実際のクラスインスタンスであるMousePosを渡しています。あなたはキャスティングオペレーターにその仕事を依頼しています。

+0

均一に変更されました。 1つの違いはありません。 – Tubbstosterone

+1

glUniform2fvはあなたのvec2の正しい呼び出しではありません。 glUniform2f(mouseposloc、MousePos.x、MousePos.y)を使用します。 –

関連する問題