【发布时间】:2013-05-27 15:20:23
【问题描述】:
我以前使用过 OpenGL,并且已经有一段时间了,但我认为它并没有这么糟糕。我在这段代码中缺少一些东西。我只是想看看我正在使用cube() 函数绘制的立方体。
我做过/尝试过的事情...
- 在主循环中翻转 + 和 -z 之间的转换
- 在主循环之前打开/关闭背面剔除
- glLoadIdentity() 开头
- 一开始就设置我的投影
- window.resetGLStates() 开头
- window.setActive(true) 开头
- 确保我留在 glMatrixMode(GL_MODELVIEW)
我错过了什么?我只能看到我指定的清晰颜色,填满屏幕并嘲弄我。
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
void cube();
int gltest()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default);
window.setVerticalSyncEnabled(true);
window.setActive(true);
window.resetGLStates();
sf::Vector2u wsize = window.getSize();
glClearColor(0.3f, 0.3f, 0.3f, 1.f);
glDepthMask(true);
glEnable(GL_DEPTH_TEST);
//to make sure I'm not missing anything here.
glDisable(GL_CULL_FACE);
glMatrixMode(GL_PROJECTION);
glViewport(0, 0, wsize.x, wsize.y);
gluPerspective(60, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
bool running = true;
while(running)
{
sf::Event event;
while(window.pollEvent(event))
{
switch(event.type)
{
case sf::Event::KeyPressed:
if(event.key.code != sf::Keyboard::Escape) { break; }
case sf::Event::Closed:
running = false;
break;
case sf::Event::Resized:
wsize.x = event.size.width;
wsize.y = event.size.height;
glMatrixMode(GL_PROJECTION);
glViewport(0, 0, wsize.x, wsize.y);
gluPerspective(60.f, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
glMatrixMode(GL_MODELVIEW);
break;
default:
break;
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.f, 0.f, 5.f);
cube();
glPopMatrix();
window.display();
}
return 0;
}
void cube()
{
glBegin(GL_QUADS); // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f); // Color Green
glNormal3f(0.f, 1.f, 0.f);
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Top)
glNormal3f(0.f, 1.f, 0.f);
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Top)
glNormal3f(0.f, 1.f, 0.f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
glNormal3f(0.f, 1.f, 0.f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f); // Color Orange
glNormal3f(0.f, -1.f, 0.f);
glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom)
glNormal3f(0.f, -1.f, 0.f);
glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom)
glNormal3f(0.f, -1.f, 0.f);
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom)
glNormal3f(0.f, -1.f, 0.f);
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f, 0.0f, 0.0f); // Color Red
glNormal3f(0.f, 0.f, 1.f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front)
glNormal3f(0.f, 0.f, 1.f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front)
glNormal3f(0.f, 0.f, 1.f);
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front)
glNormal3f(0.f, 0.f, 1.f);
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front)
glColor3f(1.0f, 1.0f, 0.0f); // Color Yellow
glNormal3f(0.f, 0.f, -1.f);
glVertex3f( 1.0f,-1.0f,-1.0f); // Top Right Of The Quad (Back)
glNormal3f(0.f, 0.f, -1.f);
glVertex3f(-1.0f,-1.0f,-1.0f); // Top Left Of The Quad (Back)
glNormal3f(0.f, 0.f, -1.f);
glVertex3f(-1.0f, 1.0f,-1.0f); // Bottom Left Of The Quad (Back)
glNormal3f(0.f, 0.f, -1.f);
glVertex3f( 1.0f, 1.0f,-1.0f); // Bottom Right Of The Quad (Back)
glColor3f(0.0f, 0.0f, 1.0f); // Color Blue
glNormal3f(-1.f, 0.f, 0.f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left)
glNormal3f(-1.f, 0.f, 0.f);
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left)
glNormal3f(-1.f, 0.f, 0.f);
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left)
glNormal3f(-1.f, 0.f, 0.f);
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left)
glColor3f(1.0f, 0.0f, 1.0f); // Color Violet
glNormal3f(1.f, 0.f, 0.f);
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right)
glNormal3f(1.f, 0.f, 0.f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
glNormal3f(1.f, 0.f, 0.f);
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right)
glNormal3f(1.f, 0.f, 0.f);
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // End Drawing The Cube
}
【问题讨论】:
-
你有没有通过 while(window.pollEvent(event)) 循环?
标签: c++ opengl graphics 3d sfml