Ich arbeite an was ein einfaches OpenGl 4 Projekt sein soll. Ich möchte nur den Alpha-Wert um den Mauszeiger verändern und verschmelzen. Nach einiger Arbeit gelang es mir, einen Kreis zu bekommen, um Werte zu ändern, aber er ist statisch (bewegt sich nicht mit der Maus) und ist auf (0,512) zentriert, sehr viel nicht der Ort meiner Maus. Ich schicke die Mauswerte durch meine passiveMotionFunc:Falsche Werte zu GLSL Frag Shader
Wo MousePos ist nur ein einfacher Schwimmer-Container. Ich habe die print-Anweisung, nur damit ich die Werte meiner Mausposition sehen kann.
meine frag Shader ist einfach:
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;
}
}
Ich bin absolut auf diese stecken. Ich gehe davon aus, dass der Frag Shader keine aktualisierten Mauskoordinaten erhält, denn wenn das FragCoord durcheinander gebracht würde, würde es keinen Kreis erzeugen.
EDIT: Ich meine Blending in einer init() - Funktion, die meine GlutDisplay und GlutPassiveFunc in main() vorangestellt.
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: Hier ist meine vec2 Definition:
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); }
};
Machst du irgendetwas mit dem Alpha? Wo ist dein Mischungssetup? –
Woher wissen Sie, dass mouseCoord nicht richtig übertragen wurde? Versuchen Sie, ein Fragment mit einer Farbe bei mouseCoord zu platzieren und sehen Sie, ob es an benötigten Koordinaten erscheint. Kannst du auch zeigen, welcher MouseCoord-Typ ist? Es scheint nicht nur ein Array zu sein. –
Ich habe meine vec2-Definition hinzugefügt. Solche Probleme hat es bisher nicht gegeben. I hinzugefügt: if (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} zu meinem frag Shader und sah keinen Unterschied. um fair zu sein, selbst wenn es auftauchen würde, wäre es unter der Maus. – Tubbstosterone