OpenGL不绘制到SDL2窗口
OpenGL Not Drawing To SDL2 Window
所以我正在用c++制作游戏,我使用SDL2和OpenGL/GLEW。我试图只是画基本的形状到我的窗口,然而,它只是创建一个黑屏时,它应该画一个三角形。这是代码
游戏循环:
int main(int argc, char** argv) {
Window window("Test", 600, 400);
RenderingEngine e(window);
e.Init();
while (!window.IsCloseRequested()) {
window.SwapBuffers();
e.Render();
}
return 0;
}
窗口类:
Window::Window(const std::string& title, unsigned int width, unsigned int height) :
m_title(title), m_width(width), m_height(height), m_isCloseRequested(false) {
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
m_glContext = SDL_GL_CreateContext(m_window);
SDL_GL_MakeCurrent(m_window, m_glContext);
SDL_GL_SetSwapInterval(1);
glewExperimental = GL_TRUE;
GLenum res = glewInit();
if (res != GLEW_OK) {
std::cerr << "Error initializting OpenGL." << std::endl;
exit(1);
}
}
void Window::SwapBuffers() {
SDL_GL_SwapWindow(m_window);
}
RenderingEngine类:
RenderingEngine::RenderingEngine(const Window& window) : m_window(&window) {
}
RenderingEngine::~RenderingEngine() {
if (m_window) delete m_window;
}
void RenderingEngine::Init() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_FRAMEBUFFER_SRGB);
}
void RenderingEngine::Render() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
}
我不明白为什么它没有画到屏幕上,所以任何帮助都是非常感激的。谢谢!
你正在设置背面剔除,指定你的正面三角形有顺时针卷曲顺序,你想剔除所有不是正面的:
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
但是你指定的三角形有逆时针的缠绕顺序:
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
你可以通过在一张纸上画点来验证这一点,x轴向右,y轴向上。你会看到点的顺序是围绕原点逆时针的。
基于此,你的三角形被背面剔除。由于使用逆时针缠绕顺序在OpenGL中更常用,我建议通过将glFrontFace()
调用更改为:
glFrontFace(GL_CCW);
或者根本不调用,因为这是默认值
你没有加载视图/投影/模型矩阵…我想那会是个问题……如果你想在3.2样式
相关文章:
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 在C++中的SDL2窗口上显示.bmp时出现问题
- 将 SDL2 窗口设置为特定显示
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在鼠标按下时移动 SDL2 窗口的功能闪烁窗口并且移动速度不够快
- SDL2 窗口在失焦时不起作用
- SDL2 OpenGL窗口立即关闭
- 无法从窗口获取 SDL2 事件
- 初始化 bgfx 时遇到问题(使用 sdl2 窗口)
- Linux中的SDL2空透明窗口
- 尝试打开 SDL2 窗口时与 D-Bus 相关的运行时崩溃
- SDL2切换全屏:窗口位置重置
- SDL2 无法创建窗口,因为它找不到匹配的 GLX 视觉对象
- SDL2在不同线程中的两个窗口
- 调整 SDL2 窗口的大小
- SDL2窗口是否可以始终处于活动状态,并在DirectX窗口上运行
- SDL2 窗口/表面的说明
- OpenGL不绘制到SDL2窗口
- SDL2窗口不显示
- Visual Studio和SDL2窗口创建失败