私は最近、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;
}
これが解決に役立つことを願っています。