0

私は最近、OpenGL を使い始めたばかりか、それに取り込もうとしています。残念ながら、非常に古いGLFWバージョンで、かなり良いチュートリアルを見つけました。Visual Studio 2012、64 ビット、glew (64 ビット ファイル)、glfw3 (64 ビット ファイル) を使用しており、プロジェクトを 64 ビット用にコンパイルしています。

これまでのところ、関数の名前が異なるなどの理由で、コードのいくつかの部分を変更する必要がありました。

私の現在の問題は、2 つのウィンドウが開いていることです... 1 つは私のプロジェクトのディレクトリをタイトルとして持ち、もう 1 つは私の作成コードにあるように「最初のウィンドウ」と呼ばれます (以下を参照)。2 つのウィンドウのいずれも三角形を適切にレンダリングしません。さらに、「最初のウィンドウ」ウィンドウが原因で全体がスタックしているように見えます。それは無限にロードされます。

私はこれまでのところ OpenGL についてあまり知識がないことを認めなければなりません。そのため、ここで何が問題なのかを尋ねています。

OpenGL.cpp ファイルのコード (他に必要なものがあれば追加します):

#include "OpenGL.h"

// put that globaly cause functions outside of Init require the pointer but won't
// take it otherwise for me
GLFWwindow* windowOne;

OpenGL::OpenGL(int w, int h)
{
  width = w;
  height = h;

  Init();
}

OpenGL::~OpenGL()
{
  glfwTerminate();
}

void OpenGL::Init()
{
  glfwInit();

  // Window should be created here
  windowOne = glfwCreateWindow(width,height,"FirstWindow",NULL,NULL);

  running = true;

  glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
}

void OpenGL::MainLoop()
{
  do
  {
    glfwGetWindowSize(windowOne, &width, &height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    Update();
    Draw();
    glFlush();
    glfwSwapBuffers(windowOne);
  }
  while(running);
}

void OpenGL::Update()
{
  if(glfwGetKey(windowOne, GLFW_KEY_ESCAPE) || !glfwGetWindowAttrib(windowOne, GLFW_FOCUSED))
  {
    running = false;
  }
}

void OpenGL::Draw()
{
  glBegin(GL_TRIANGLES); 

  glVertex3f( 0.0f, 1.0f, 0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);
  glEnd();
}

問題のチュートリアルはhttp://www.hightech-journal.net/opengl-tutorial-02-das-erste-polygonです。それはドイツ語なので、特に上で述べたようにglfwバージョンが古くなっているので、誰にとっても役立つかどうかはわかりません.

必要に応じて、さらに詳しい情報を提供します。

ポインターのグローバル定義が問題を引き起こしていると想像できます。問題は、ポインターを必要とする Init 以外の他の関数がそれを宣言されていないものとして呼び出す前に (奇妙なことに、それらのすべてではありません)、そのため、グローバルに宣言した関数の多くを作り直す (そしておそらく壊れる) ことを望まなかったからです。

編集:上記は私のopenGL.cppでした他のファイル:

openGL.h:

#include "main.h"
class OpenGL
{
  public:
  OpenGL(int w, int h);
  ~OpenGL();
  void MainLoop();

  private:
  void Init();
  void Update();
  void Draw();
  bool running;

  int width;
  int height;
};

main.h (短いもの):

#include <stdlib.h>
#include "GL/glfw3.h"

main.cpp:

#include "main.h"
#include "OpenGL.h"

int main(int argc, char **argv) 
{
   OpenGL* ogl = new OpenGL(800,600);

   ogl->MainLoop();

   delete ogl;

   return 0;
} 

これが解決に役立つことを願っています。

4

1 に答える 1

0

これはコンソール アプリケーションであるため、2 つのウィンドウが表示されますが、これは正常な動作です。最初のウィンドウは、プログラムが main() を処理するときに作成するコンソール ウィンドウです。もう一方のウィンドウは、OpenGL ウィンドウ「FirstWindow」です。

最初の問題は次のとおりです。

ヘッダー ファイルの先頭に Windows ヘッダーを含めます。

#include < windows.h >

その後、main() を次のように変更します。

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpComand, int nShow)

次に、次の行を追加します。

HWND hWnd = GetConsoleWindow();
if(IsWindow(hWnd)) ShowWindow( hWnd, SW_HIDE );

これにより、コンソール ウィンドウが完全に非表示になり、FirstWindow のみが表示されます。2 番目の問題については、Init() と Update() の 2 つの関数のいずれかで間違いを犯しているに違いありません。コードをチェックして、どこで間違いを犯しているかを確認してください。

編集:更新されたコードは次のとおりです。

OpenGL.h

#pragma once
#pragma comment(lib, "glfw3.lib")
#pragma comment(lib, "opengl32.lib")

class OpenGL
{
  public:
  OpenGL(int w, int h);
  ~OpenGL();
  void MainLoop();

  private:
  void Update();
  void Prepare();
  void Draw();

  bool running;
  int width, height;
};

OpenGL.Cpp

 #include "OpenGL.h"
 #include <GLFW\glfw3.h>

 GLFWwindow* windowOne;

OpenGL::OpenGL(int w, int h): running(true), width(w), height(h)
{
    glfwInit(); //MER [Sep 20, 2013] Removed teh init() as it made no sense to have sep 
    windowOne = glfwCreateWindow(width,height,"FirstWindow",NULL,NULL);
    glfwMakeContextCurrent(windowOne);
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
}
OpenGL::~OpenGL()
{
    glfwTerminate();
    glfwDestroyWindow(windowOne); // MER [Sep 20, 2013] window destruction
}

void OpenGL::MainLoop()
{
  do
  {
    Update();
    Prepare();
    Draw();     //glFlush(); MER [Sep 20, 2013] No need to call
    glfwSwapBuffers(windowOne);
  }
  while(running);
}

void OpenGL::Update()
{
  if(glfwGetKey(windowOne, GLFW_KEY_ESCAPE) || !glfwGetWindowAttrib(windowOne, GLFW_FOCUSED))
    running = false;
}

void OpenGL::Prepare()
{
    float ratio=0.0f;

    //MER [Sep 20, 2013] You need to set the viewport
    glfwGetFramebufferSize(windowOne, &width, &height);
    ratio = width / (float) height;
    glViewport(0, 0, width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // MER [Sep 20, 2013] Clear depth buffer too.

    //MER [Sep 20, 2013] if you don't do this, triangle would be there but not visible.
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);

}
void OpenGL::Draw()
{
  glBegin(GL_TRIANGLES); 
  glVertex3f( 0.0f, 1.0f, 0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);
  glEnd();
}

Main.Cpp

#include <stdlib.h>
#include <windows.h>
#include "OpenGL.h"

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpComand, int nShow)
{
    HWND hWnd = GetConsoleWindow(); //MER  [Sep 20, 2013] This hides the window
    if(IsWindow(hWnd)) ShowWindow( hWnd, SW_HIDE );

   OpenGL* ogl = new OpenGL(200,200); //MER [Sep 20, 2013] sitting in ma office, can't run window in big size
   ogl->MainLoop();
   delete ogl;

   return 0;
} 

Glückwünsche, Sie haben Ihre rotierende Dreieck

main.h は役に立たなかったので削除しました。環境はVS2012 x32bit、Windows 7-32bitです。gl32.lib (プラットフォーム SDK 7.1A) と glfw ライブラリにリンクされた glfw と openGl32.h (プラットフォーム sdk 7.1A) の追加ディレクトリを追加しました。

于 2013-09-19T10:49:13.647 に答える