SFML + OpenGL:无法绘制立方体
SFML + OpenGL: Unable to draw cube
我以前使用过OpenGL,已经有一段时间了,但我没想到它这么糟糕。这段代码中我遗漏了一些东西。我只是想用cube()
函数来画一个立方体。
我做过/尝试过的事…
- 在主循环中翻转+和- z之间的转换
- 在主循环前打开/关闭背面剔除
- 开头的glloadiidentity ()
- 设置我的投影在开始
- 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
}
此处:
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);
在glMatrixMode(GL_PROJECTION)
和glMatrixMode(GL_MODELVIEW)
呼叫后增加一个glLoadIdentity()
gluPerspective()
将矩阵与当前矩阵相乘。代码似乎假设它覆盖当前矩阵。
一个gluPerspective()
矩阵与自身多次相乘不是一个有意义的投影矩阵。
当你在那里时,你可以删除resize处理程序:
#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;
}
相关文章:
- 如何使用 std::累积在 C++ 中计算总和立方体
- QuadTree只在窗口的右上角绘制
- Opengl 和 c++ 绘制多个立方体
- 为什么在GLFW窗口中没有用这个代码在我的屏幕上绘制立方体
- 在版本 440 核心中绘制具有纹理的立方体的顶点和片段着色器应该是什么
- C++/OpenGL-用VBO绘制立方体
- 如何使用 glDrawElements() 绘制硬表面立方体
- 在 OpenGL 中绘制立方体。迭代代码较短,但不起作用
- 如何绘制一个所有面都有不同纹理的立方体
- 在 OpenGL 中绘制一个实体立方体
- 使用鼠标在 Opengl 中绘制一个立方体
- OpenGL 3.2+ 围绕现有顶点绘制立方体
- 如何使用glDrawElements在OpenGL中绘制立方体
- OpenGL -当我在立方体上绘制边界时,会出现额外的线
- 在c++中绘制填充立方体,崩溃,没有有用的错误可以跟踪
- SFML + OpenGL:无法绘制立方体
- c++ OpenGL, GLFW绘制一个简单立方体
- c++旋转立方体坐标(非绘制)
- 如何在某些世界坐标下绘制立方体,OpenGL
- D3D9从Vertexbuffer绘制100k立方体非常慢