2016-11-10 8 views
0

プロジェクトの一部として;私は、私は三日月&スターを削除し、現在のフラグ自体を振るしようとしている波効果を追加するために管理することができませんでしたOpenGLでのフラッグ効果の波打ち(C++)

https://i.stack.imgur.com/db5zB.gif

:以下に示すように、私は手を振っ効果の旗を作成する必要があります。

私が時間を過ぎると、アニメーションが起こらないように更新されません。 私はこれまでやったことです:

#include "Angel.h" 
float PI = 3.14; 
int verticeNumber = 0; 
float time; 
struct point { 
    GLfloat x; 
    GLfloat y; 
}; 
point vertices[500]; 




// OpenGL initialization 
void init() 
{ 

    // Create a vertex array object 
    vertices[0].x = -0.75; 
    vertices[0].y = 0.5; 
    vertices[1].x = 0.75; 
    vertices[1].y = 0.5; 
    vertices[2].x = 0.75; 
    vertices[2].y = -0.5; 
    vertices[3].x = -0.75; 
    vertices[3].y = -0.5; 
    vertices[4].x = -0.75; 
    vertices[4].y = 0.5; 

    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    GLuint buffer; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
    // Load shaders and use the resulting shader program 
    time = glutGet(GLUT_ELAPSED_TIME); 
    GLuint program = InitShader("vshader.glsl", "fshader.glsl"); 
    glUseProgram(program); 
    // set up vertex arrays 
    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    // Paint the background 
    glClearColor(0.36, 0.74, 0.82, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); 


    glutSwapBuffers(); 

} 
void display(void) 
{ 

} 


// Ends the program on ESC press. 
void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) { 
    case 033: 
     exit(EXIT_SUCCESS); 
     break; 
    } 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(800, 800); 

    // OpenGL Version Check 
    glutInitContextVersion(3, 2); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 
    // Name the window 
    glutCreateWindow("I'm Rick Harrison, and this is my pawn shop"); 
    glewExperimental = GL_TRUE; 
    glewInit(); 

    init(); 

    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 

    glutMainLoop(); 
    return 0; 
} 

マイシェーダファイルは、次のとおりです。

#version 430 
varying vec4 f_color; 

void main(void) { 
    gl_FragColor = vec4(1,0,0,1); 
} 

#version 430 
in vec4 vPosition; 
in float time; 
void main() 
{ 
    vec4 temp = vPosition; 
    temp.y = cos(0.1*time)*temp.y; 
    gl_Position = temp; 
} 

それはこの中で結果: https://i.stack.imgur.com/MVSp0.png任意のアニメーションなし。

答えて

1

user2927848で言及された時間を更新する必要があります。私はちょうどあなたの波う効果を助言したいと思います。 頂点シェーダで時刻を渡したい場合は、頂点シェーダが呼び出されるのは、頂点ごとにピプラインでの4倍であるため、自分で生成した頂点が4つ以上必要です。あなたが期待した美容効果は得られません。

結論として、フラグがスムーズに振る舞うには2つの方法があります。バーテックスシェーダへ

  1. 峠より頂点
  2. は、フラグメントシェーダへの最初の提案で

を時間変数を渡し、あなたはスムーズにそれを作るために多分100 * 50の頂点を生成する必要がある、または多分あなたが好きなようにもっとよく見えるように。

2番目の提案にも少し問題があります。イメージがあなたの飛行機に完全に収まる場合は、何らかの理由でイメージに境界から余裕を持たせる必要があります。これをスローする簡単な方法は、あなたの* .pngイメージに境界線での透明度マージンを設定し、uv値であなたの波動関数を何でもすることです。

shadertoyでもっとも単純な波打ち効果を実装するだけです。 はまた、以下のコードを入れて、それが短いので

void mainImage(out vec4 fragColor, in vec2 fragCoord) 
{ 
    vec2 uv = fragCoord.xy/iResolution.xy; 
    uv.y = uv.y + 0.1 * sin(iGlobalTime + 10.0 * uv.x); 
    vec4 textureColor = texture2D(iChannel0, uv); 
    fragColor = textureColor; 
} 
1

各フレームの「時間」は更新されません。 https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/uniform.php

あなたのディスプレイ機能は空ですので、あなたは 'init'の後でイメージを再描画しません。時間を調整しても、それだけでは解決されません。表示機能では、実際に描画/切り替えバッファをすべて実行する必要があります。

このようにしても、アイテム全体が上下に移動します。フラグの基点からの距離に基づいてオフセットが計算されるcos(速度*(時間+オフセット))が必要です。アニメーションが流動的になるためには、頂点がかなり必要になるでしょう

かなりの問題がありますが、それは正しい方向に動くはずです。

+0

はすべての問題を指していただきありがとうございます...、私はそれらの上で作業を開始します – Aguen

関連する問題