質問編集履歴
3
この一つ前の修正の結果、タイトルの日本語が怪しくなったので修正
    
        title	
    CHANGED
    
    | @@ -1,1 +1,1 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            ウィンドウを移動するまで正常に図形が描画されない(OpenGL、GLFW)
         | 
    
        body	
    CHANGED
    
    | 
            File without changes
         | 
2
自力での調査で解決した部分があったのでそれに伴う文章と画像の差し替え。そして調べていく過程でOSや開発環境自体の問題である可能性を指摘されたので環境の追記とタグの追加。
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -1,12 +1,16 @@ | |
| 1 | 
            +
            環境:
         | 
| 2 | 
            +
              MacOS 10.14.5
         | 
| 3 | 
            +
              Xcode 10.3
         | 
| 4 | 
            +
             | 
| 1 5 | 
             
            床井研究室様の『GLFWによるOpenGL入門』(http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf)を見て勉強しています。
         | 
| 2 6 |  | 
| 3 | 
            -
            第6章100P | 
| 7 | 
            +
            第6章100Pまで行い、下記のソース(字数の都合上コメントを一部省略)ができたのですが、起動後は真ん中に(図1)、ウィンドウのサイズを変えると図形の位置が変わり、そこからウィンドウを移動すると再び図形の位置が戻ります。(図2,図3)
         | 
| 4 | 
            -
            
         | 
| 5 9 | 
             
                        ---図1 起動直後---
         | 
| 6 | 
            -
            
         | 
| 7 11 | 
             
                        ---図2 サイズ変更後---
         | 
| 8 | 
            -
            
         | 
| 9 | 
            -
                                ---図3 サイズ変更後 | 
| 13 | 
            +
                                ---図3 サイズ変更後、移動---
         | 
| 10 14 |  | 
| 11 15 | 
             
            ```main
         | 
| 12 16 | 
             
            #include<cstdlib>
         | 
| @@ -136,7 +140,7 @@ | |
| 136 140 | 
             
                return vstat && fstat ? createProgram(vsrc.data(), fsrc.data()) : 0;
         | 
| 137 141 | 
             
            }
         | 
| 138 142 |  | 
| 139 | 
            -
             | 
| 143 | 
            +
             | 
| 140 144 | 
             
            constexpr Object::Vertex rectangleVertex[] =
         | 
| 141 145 | 
             
            {
         | 
| 142 146 | 
             
                {-0.5f ,-0.5f },
         | 
| @@ -186,8 +190,7 @@ | |
| 186 190 |  | 
| 187 191 | 
             
                    //図形を描画
         | 
| 188 192 | 
             
                    shape -> draw();
         | 
| 189 | 
            -
                
         | 
| 190 | 
            -
             | 
| 193 | 
            +
             
         | 
| 191 194 | 
             
                    window.swapBuffers();
         | 
| 192 195 | 
             
                }
         | 
| 193 196 | 
             
            }
         | 
| @@ -202,11 +205,8 @@ | |
| 202 205 |  | 
| 203 206 | 
             
            // ウィンドウ関連の処理
         | 
| 204 207 | 
             
            class Window{
         | 
| 205 | 
            -
                //ウィンドウのハンドル
         | 
| 206 208 | 
             
                GLFWwindow *const window;
         | 
| 207 209 |  | 
| 208 | 
            -
             | 
| 209 | 
            -
                
         | 
| 210 210 | 
             
                //ウィンドウのサイズ
         | 
| 211 211 | 
             
                GLfloat size[2];
         | 
| 212 212 |  | 
| @@ -251,8 +251,7 @@ | |
| 251 251 | 
             
                    resize(window,width,height);
         | 
| 252 252 | 
             
                }
         | 
| 253 253 |  | 
| 254 | 
            -
                    
         | 
| 255 | 
            -
             | 
| 254 | 
            +
             | 
| 256 255 | 
             
                virtual ~Window(){
         | 
| 257 256 | 
             
                    glfwDestroyWindow(window);
         | 
| 258 257 | 
             
                }
         | 
| @@ -264,10 +263,7 @@ | |
| 264 263 |  | 
| 265 264 | 
             
                //カラーバッファを入れ替えてイベントを取り出す
         | 
| 266 265 | 
             
                void swapBuffers(){
         | 
| 267 | 
            -
                    //カラーバッファを入れ替える
         | 
| 268 266 | 
             
                    glfwSwapBuffers(window);
         | 
| 269 | 
            -
                    
         | 
| 270 | 
            -
                    //イベントを取り出す
         | 
| 271 267 | 
             
                    glfwWaitEvents();
         | 
| 272 268 | 
             
                }
         | 
| 273 269 |  | 
| @@ -361,7 +357,6 @@ | |
| 361 357 | 
             
                const GLsizei vertexcount;
         | 
| 362 358 |  | 
| 363 359 | 
             
            public:
         | 
| 364 | 
            -
                //コンストラクタ
         | 
| 365 360 | 
             
                Shape(GLint size,GLsizei vertexcount,const Object::Vertex *vertex)
         | 
| 366 361 | 
             
                :object(new Object(size,vertexcount,vertex))
         | 
| 367 362 | 
             
                ,vertexcount(vertexcount)
         | 
| @@ -388,8 +383,8 @@ | |
| 388 383 | 
             
            in vec4 position;
         | 
| 389 384 |  | 
| 390 385 | 
             
            void main(){
         | 
| 391 | 
            -
                gl_Position = vec4(2.0 * scale/size,1.0 , 1.0) * position;
         | 
| 386 | 
            +
                gl_Position = vec4(2.0 * scale/size, 1.0 , 1.0) * position;
         | 
| 392 | 
            -
             | 
| 387 | 
            +
                //二つ目の1.0のの前に空白を入れると動いた
         | 
| 393 388 | 
             
            ```
         | 
| 394 389 |  | 
| 395 390 | 
             
            ```FragmentShader
         | 
| @@ -401,8 +396,8 @@ | |
| 401 396 | 
             
            }
         | 
| 402 397 |  | 
| 403 398 | 
             
            ```
         | 
| 399 | 
            +
            ウィンドウのサイズが切り替わっても真ん中に表示したいのですが、移動するまでは左下の位置のままです、どうかよろしくお願いします。
         | 
| 404 400 |  | 
| 405 | 
            -
             | 
| 401 | 
            +
            追伸
         | 
| 406 | 
            -
             | 
| 407 | 
            -
             | 
| 408 | 
            -
             | 
| 402 | 
            +
            バーテックスシェーダに1つスペースを加えたら、図形が横長になる問題とサイズがウィンドウに比例する問題は自己解決したので質問の画像、文章などを差し替えさせていただきました。
         | 
| 403 | 
            +
            現在は画面サイズ変更に伴う図形の移動について悩んでいます。
         | 
1
字数の都合から削っていたWindow.hのコメントを追記
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -200,73 +200,95 @@ | |
| 200 200 | 
             
            #include <GL/glew.h>
         | 
| 201 201 | 
             
            #include <GLFW/glfw3.h>
         | 
| 202 202 |  | 
| 203 | 
            +
            // ウィンドウ関連の処理
         | 
| 203 204 | 
             
            class Window{
         | 
| 205 | 
            +
                //ウィンドウのハンドル
         | 
| 204 206 | 
             
                GLFWwindow *const window;
         | 
| 207 | 
            +
                
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                
         | 
| 210 | 
            +
                //ウィンドウのサイズ
         | 
| 205 211 | 
             
                GLfloat size[2];
         | 
| 212 | 
            +
                
         | 
| 213 | 
            +
                //ワールド座標系に対するデバイス座標系の拡大率
         | 
| 206 214 | 
             
                GLfloat scale;
         | 
| 207 215 |  | 
| 208 216 | 
             
            public:
         | 
| 217 | 
            +
                //コンストラクタ
         | 
| 209 218 | 
             
                Window(int width = 640, int height = 480, const char *title = "Hello!")
         | 
| 210 219 | 
             
                : window(glfwCreateWindow(width, height, title, NULL, NULL))
         | 
| 211 220 | 
             
                , scale(100.0f)
         | 
| 212 221 | 
             
                {
         | 
| 213 222 | 
             
                        if(window == NULL)
         | 
| 214 223 | 
             
                        {
         | 
| 224 | 
            +
                            //ウィンドウが作成できなかった
         | 
| 215 | 
            -
                            std::cerr << "Can't create window." << std::endl;
         | 
| 225 | 
            +
                            std::cerr << "Can't create GLFW window." << std::endl;
         | 
| 216 226 | 
             
                            exit(1);
         | 
| 217 227 | 
             
                        }
         | 
| 218 228 |  | 
| 229 | 
            +
                    //現在のウィンドウを処理対象にする
         | 
| 219 230 | 
             
                    glfwMakeContextCurrent(window);
         | 
| 220 231 |  | 
| 232 | 
            +
                    //GLEWを初期化する
         | 
| 221 233 | 
             
                    glewExperimental = GL_TRUE;
         | 
| 222 234 | 
             
                    if(glewInit() != GLEW_OK)
         | 
| 223 235 | 
             
                    {
         | 
| 236 | 
            +
                        //GLEWの初期化に失敗した
         | 
| 224 237 | 
             
                        std::cerr << "Can't initialize GLEW" << std::endl;
         | 
| 225 238 | 
             
                        exit(1);
         | 
| 226 239 | 
             
                    }
         | 
| 227 240 |  | 
| 241 | 
            +
                    //垂直同期のタイミングを待つ
         | 
| 228 242 | 
             
                    glfwSwapInterval(1);
         | 
| 229 243 |  | 
| 230 | 
            -
                    //このインスタンスの this ポインタを記録
         | 
| 244 | 
            +
                    //このインスタンスの this ポインタを記録しておく
         | 
| 231 245 | 
             
                    glfwSetWindowUserPointer(window, this);
         | 
| 232 246 |  | 
| 233 | 
            -
                    // | 
| 247 | 
            +
                    //ウィンドウのサイズ変更時に呼び出す処理の登録
         | 
| 234 248 | 
             
                    glfwSetWindowSizeCallback(window,resize);
         | 
| 249 | 
            +
                    
         | 
| 235 | 
            -
             | 
| 250 | 
            +
                    //開いたウィンドウの初期設定
         | 
| 236 251 | 
             
                    resize(window,width,height);
         | 
| 237 252 | 
             
                }
         | 
| 253 | 
            +
                    
         | 
| 254 | 
            +
                    
         | 
| 238 | 
            -
             | 
| 255 | 
            +
                //デストラクタ
         | 
| 239 256 | 
             
                virtual ~Window(){
         | 
| 240 257 | 
             
                    glfwDestroyWindow(window);
         | 
| 241 258 | 
             
                }
         | 
| 242 259 |  | 
| 243 | 
            -
                //ウィンドウを閉じるべきかを判定
         | 
| 260 | 
            +
                //ウィンドウを閉じるべきかを判定する
         | 
| 244 261 | 
             
                int shouldClose() const{
         | 
| 245 262 | 
             
                    return glfwWindowShouldClose(window);
         | 
| 246 263 | 
             
                }
         | 
| 247 264 |  | 
| 248 265 | 
             
                //カラーバッファを入れ替えてイベントを取り出す
         | 
| 249 266 | 
             
                void swapBuffers(){
         | 
| 267 | 
            +
                    //カラーバッファを入れ替える
         | 
| 250 268 | 
             
                    glfwSwapBuffers(window);
         | 
| 269 | 
            +
                    
         | 
| 270 | 
            +
                    //イベントを取り出す
         | 
| 251 271 | 
             
                    glfwWaitEvents();
         | 
| 252 272 | 
             
                }
         | 
| 253 273 |  | 
| 274 | 
            +
             | 
| 254 | 
            -
                // | 
| 275 | 
            +
                //ウィンドウのサイズを取り出す
         | 
| 255 276 | 
             
                const GLfloat *getSize() const { return size; }
         | 
| 256 277 |  | 
| 257 278 | 
             
                //ワールド座標系に対するデバイス座標系の拡大率を取り出す
         | 
| 258 279 | 
             
                GLfloat getScale() const{ return scale; }
         | 
| 259 280 |  | 
| 260 | 
            -
                //  | 
| 281 | 
            +
                // ウィンドウのサイズ変更時の処理
         | 
| 261 282 | 
             
                static void resize(GLFWwindow *const window,int width,int height)
         | 
| 262 283 | 
             
                {
         | 
| 284 | 
            +
                    //ウィンドウ全体をビューポートに設定する
         | 
| 263 | 
            -
             | 
| 285 | 
            +
                    glViewport(0, 0, width, height);
         | 
| 264 286 |  | 
| 265 287 | 
             
                    //このインスタンスのthisポインタを得る
         | 
| 266 288 | 
             
                    Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(window)));
         | 
| 267 289 |  | 
| 268 290 | 
             
                    if(instance != NULL){
         | 
| 269 | 
            -
                        //開いたウィンドウのサイズを保存
         | 
| 291 | 
            +
                        //開いたウィンドウのサイズを保存する
         | 
| 270 292 | 
             
                        instance->size[0] = static_cast<GLfloat>(width);
         | 
| 271 293 | 
             
                        instance->size[1] = static_cast<GLfloat>(height);
         | 
| 272 294 | 
             
                    }
         | 
