我以前使用过OpenGL,已经有一段时间了,但是我并不认为这很糟糕。这段代码中我缺少一些东西。我只是想查看使用cube()
函数绘制的多维数据集。
我做过/尝试过的事情...
开头的
我想念什么?我所看到的只是我指定的清晰颜色,填满了屏幕并 mock 我。
#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
}
最佳答案
这里:
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();
和这里:
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);
在
glLoadIdentity()
和glMatrixMode(GL_PROJECTION)
调用之后添加glMatrixMode(GL_MODELVIEW)
。gluPerspective()
将一个矩阵与当前矩阵相乘。该代码似乎是假设它覆盖了当前矩阵。自身乘以多次的
gluPerspective()
矩阵不是有意义的投影矩阵。在此期间,您可以删除调整大小处理程序:
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
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
}
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default);
window.setVerticalSyncEnabled(true);
window.setActive(true);
window.resetGLStates();
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;
default:
break;
}
}
glClearColor(0.3f, 0.3f, 0.3f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
sf::Vector2u wsize = window.getSize();
glViewport(0, 0, wsize.x, wsize.y);
gluPerspective(60, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(0.f, 0.f, -5.f);
cube();
glPopMatrix();
GLenum err = glGetError();
window.display();
}
return 0;
}