私は単純な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); }
};
アルファで何かしていますか?あなたのブレンド設定はどこですか? –
mouseCoordが正しく転送されなかったことをどのように知っていますか? mouseCoordで色分けして、必要な座標に表示されているかどうかを確認してください。 MouseCoordのタイプを表示することはできますか?それはちょうど配列のようではありません。 –
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