2013-12-05 6 views
1

Я пытаюсь выяснить, как сделать opengl работы в Windows 8.1 с использованием Visual Studio 2012.Невозможно нарисовать opengl в visual studio 2012

Моя программа компилируется и запускается, но ничего не происходит в созданных окнах, я даже не могу изменить цвет фона или видеть мышь.

Моя программа выглядит следующим образом:

main.cpp

#include <cstdio> 
#include <iostream> 
#include "simpleViewer.h" 

using namespace std; 

int main(int argc, char **argv){ 
simpleViewer Viewer; 
Viewer.initOpenGL(argc, argv); 
Viewer.run(); 
} 

simpleViewer.h

#pragma once 
#ifndef _SIMPLEVIEWER_H_ 
#define _SIMPLEVIEWER_H_ 
#include "GL\GL\glut.h" 
#include <iostream> 
enum DisplayModes { 
DISPLAY_MODE_OVERLAY, 
DISPLAY_MODE_DEPTH, 
DISPLAY_MODE_IMAGE 
}; 


class simpleViewer 
{ 
public: 
simpleViewer(void); 
~simpleViewer(void); 
virtual void run(); 
virtual void initOpenGL(int argc, char **argv); 
virtual void initOpenGLHooks(); 
virtual void display(); 
virtual void displayPostDraw(){}; 
DisplayModes m_eViewState; 
private: 
static simpleViewer* ms_self; 
static void glutIdle(); 
static void glutDisplay(); 

}; 
#endif 

и simpleViewer.cpp

#include "simpleViewer.h" 

#define GL_WIN_SIZE_X 1280 
#define GL_WIN_SIZE_Y 1024 

// Undeprecate CRT functions 
#ifndef _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_NO_DEPRECATE 1 
#endif 

simpleViewer* simpleViewer::ms_self; 
simpleViewer::simpleViewer(void) 
{ 
ms_self = this; 
} 


simpleViewer::~simpleViewer(void) 
{ 
} 

void simpleViewer::initOpenGL(int argc, char **argv) 
{ 
glutInit(&argc, argv); 
glutInitWindowSize(GL_WIN_SIZE_X, GL_WIN_SIZE_Y); 
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
glutCreateWindow ("Test"); 
// glutFullScreen(); 
glutSetCursor(GLUT_CURSOR_NONE); 
initOpenGLHooks(); 
glDisable(GL_DEPTH_TEST); 
glEnable(GL_TEXTURE_2D); 
glClearColor(1.0f,0.0f,0.0f,1.0f); 
} 
void simpleViewer::initOpenGLHooks() 
{ 
glutDisplayFunc(glutDisplay); 
glutIdleFunc(glutIdle); 
} 
void simpleViewer::run(){ 
glutMainLoop(); 
} 

void simpleViewer::display(){ 
glBegin(GL_TRIANGLES); 
glColor3f(1.0,0,0); 
glVertex3f(0.1,0,0); 
glVertex3f(0,0,0); 
glVertex3f(0,0,0.1); 
glEnd(); 
glFlush(); 

} 
void simpleViewer::glutIdle(){ 
glutPostRedisplay(); 
} 
void simpleViewer::glutDisplay(){ 
     simpleViewer::ms_self->display(); 
} 

Я проверил, так что это действительно идет в display(), но ничего не происходит. Фон полностью белый, даже если он должен быть красным.

ответ

1

Вы запросили двойную буферизацию через GLUT_DOUBLE.

Используйте glutSwapBuffers() вместо glFlush() в конце simpleViewer::display().

glClearColor() только фиксирует состояние. glClear() на самом деле. Ясно. Добавьте glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) вверху simpleViewer::display().

Этот треугольник является выигрышным для матриц проекции/модели представления по умолчанию. Попробуйте это вместо:

glBegin(GL_TRIANGLES); 
glVertex2i(0, 0); 
glVertex2i(1, 0); 
glVertex2i(1, 1); 
glEnd(); 

Возможно, вы захотите также изменить цвет треугольника. Красный на красном довольно сложно увидеть :)

+0

Итак, теперь фон черный, а треугольник еще нет, и мышь исчезает, когда я перемещаю его по окну. –

+0

@Erik: отредактирован ответ. – genpfault

+0

@Erik: Мышь, вероятно, связана с вызовом 'glutSetCursor (GLUT_CURSOR_NONE)'. – genpfault

Смежные вопросы