0

我最近才开始使用 OpenGL,或者更确切地说是尝试进入它。我找到了一个相当不错的教程,不幸的是,它的 GLFW 版本非常过时。我正在使用 Visual Studio 2012、64 位、glew(64 位文件)、glfw3(64 位文件)并将我的项目编译为 64 位。

到目前为止,由于现在函数名称不同等原因,我不得不更改代码的一些部分。

我目前的问题是,我确实打开了两个窗口......一个以我的项目目录为标题,一个名为“第一个窗口”,因为我在我的创建代码中有它(见下文)。两个窗口都没有按应有的方式渲染三角形,而且“第一个窗口”窗口似乎使整个事物卡住了。它只是无休止地加载。

我不得不承认到目前为止我对 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"

主.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

由于它是一个控制台应用程序,因此会出现两个窗口,这是正常行为。第一个窗口是您的程序在处理 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。至于您的第二个问题,您必须在两个函数中的任何一个中出错: Init() 和 Update() 检查代码以查看您在哪里出错:

编辑:这是您更新的代码:

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();
}

主程序.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 回答