我正在研究什么应该是一个简单的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); }
};
你在做什么与阿尔法?你的混合装置在哪里? – 2012-04-14 16:41:23
你怎么知道mouseCoord没有正确传输?尝试在mouseCoord上添加一些颜色的片段,看看它是否出现在需要的坐标上。你还可以展示MouseCoord类型是什么?它似乎不是一个阵列。 – 2012-04-14 16:50:32
我在我的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