【问题标题】:SDL OpenGL issueSDL OpenGL 问题
【发布时间】:2014-01-06 17:13:47
【问题描述】:

我正在关注 youtube 上的教程,但问题是教程的制作者使用的是 SDL 1.2,而我使用的是 2.00,因此我不得不按照 SDL 迁移指南稍微更改代码。但是,我的代码并没有按照它应该做的事情来绘制一个三角形。就那么简单。我得到的只是一个白屏。

======main============

#include "stdafx.h"


void init()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 640.0 / 480.0, 1.0, 500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glVertex3f(0.0, 2.0, -5.0);
    glVertex3f(-2.0, -2.0, -5.0);
    glVertex3f(2.0, -2.0, -5.0);
    glEnd();
}

int main(int argc, char* argv[]){
SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Window * window;
    window = SDL_CreateWindow("OpenGLTest", 300, 300, 640, 480, SDL_WINDOW_SHOWN |       SDL_WINDOW_OPENGL);
    init();
    SDL_Event * mainEvent;
    mainEvent = new SDL_Event;

    while (true){
        SDL_PollEvent(mainEvent);
        display();
        SDL_GL_SwapWindow(window);

        if (mainEvent->type == SDL_QUIT){
            break;
        }
    }

return 0;
}

=====stdafx==========

#pragma once

#include <iostream>
#include <SDL.h>
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>

#define PI 3.14159265

using namespace std;

任何想法我做错了什么?

【问题讨论】:

  • 尝试使用 glColor3f 或 glColor4f 设置颜色
  • 但是不应该在黑色背景上绘制一个白色三角形吗?因为背景被清除为黑色,默认绘制颜色为白色?
  • 我试过了。它没有工作
  • 你设置 glViewport(0.f, [windowWidth], [windowHeight], 0.f) 了吗?
  • 所以?该函数设置活动渲染区域,它不强制任何正交矩阵。

标签: opengl sdl


【解决方案1】:

SDL_WINDOW_OPENGL 是必要的,但还不够。

使用SDL_GL_CreateContext() 创建一个总帐上下文,并通过SDL_GL_MakeCurrent() 使其成为最新:

#include <GL/glew.h>
#include <SDL/SDL.h>

int main( int argc, char *argv[] )
{
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Window * window = SDL_CreateWindow
        (
        "OpenGLTest", 
        300, 300, 
        640, 480, 
        SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL
        );
    SDL_GLContext context = SDL_GL_CreateContext( window );
    SDL_GL_MakeCurrent( window, context );

    glewInit();

    bool running = true;
    while( running )
    {
        SDL_Event ev;
        while( SDL_PollEvent( &ev ) )
        {
            if ( ev.type == SDL_QUIT)
                running = false;
        }

        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45, 640.0 / 480.0, 1.0, 500.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 2.0, -5.0);
        glVertex3f(-2.0, -2.0, -5.0);
        glVertex3f(2.0, -2.0, -5.0);
        glEnd();

        SDL_GL_SwapWindow(window);
    }

    SDL_GL_DeleteContext( context );
    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}

【讨论】:

  • @user3161752:如果这解决了您的问题,那么在 Stack Overflow 上投票/接受是正确的做法。只有当提出问题的人接受 A 时,Q&A 才有效;)
  • 对不起,我还没起床,因为我没有足够的声誉,但我选择了你的答案
  • 就我而言,我(不小心)在SDL_GL_SwapWindow() 之后添加了SDL_RenderPresent()。删除它为我修复。感谢 genpfault 的完整演示。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多