2012-04-14 70 views
0

我正在研究什么应该是一个简单的OpenGl 4项目。我所要做的就是改变鼠标指针周围的alpha值并混合。经过一番努力,我设法得到了一个圆来改变数值,但它是静态的(不随鼠标移动)并且居中于(0,512),而非鼠标的位置。我通过我的passiveMotionFunc发送鼠标值:不正确的值到GLSL碎片着色器

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只是一个简单的浮动容器。我有打印声明,所以我可以看到我的鼠标位置的值。

我的frag着色器很简单:

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被搞乱了,它不会产生一个圆圈。

编辑:我在我的glutDisplay和main()中的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:这里是我的VEC 2的定义:

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

你在做什么与阿尔法?你的混合装置在哪里? – 2012-04-14 16:41:23

+0

你怎么知道mouseCoord没有正确传输?尝试在mouseCoord上添加一些颜色的片段,看看它是否出现在需要的坐标上。你还可以展示MouseCoord类型是什么?它似乎不是一个阵列。 – 2012-04-14 16:50:32

+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} 我的碎片着色器,并没有看到区别。尽管如此,即使它确实出现了,它也会在鼠标下。 – Tubbstosterone 2012-04-14 17:50:45

回答

1

你需要为了在把它作为一个宣布mousePos结构为uniform。您的片段着色器将其声明为“in”。

此外,您正在使用矢量统一上传glUniform2fv从您的vec2类实例MousePos加载。您应该以2-arg的形式glUniform2f加载它。 glUniform2fv表单正在查找一个参数,该参数是指向2个浮点值块的指针作为其最后一个参数。你在那里传递MousePos,这是一个实际的类实例,你指望你的铸造操作员来完成这项工作。

+0

将它改为统一。没有一个区别。 – Tubbstosterone 2012-04-14 21:49:38

+1

glUniform2fv不适合你的vec2。使用glUniform2f(mouseposloc,MousePos.x,MousePos.y); – 2012-04-14 21:52:56