我遇到了 SDL 表示它不支持 OpenGL 3.x 上下文的问题。我正在尝试按照本教程进行操作:Creating a Cross Platform OpenGL 3.2 Context in SDL (C / SDL) .在这种情况下,我使用的是 GLEW,但我也无法让 gl3.h 使用它。这是我最终得到的代码:
#include <glew.h>
#include <SDL.h>
int Testing::init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
printSDLError();
system("pause");
return 1; // Error
}
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//set double buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//Create window
window = SDL_CreateWindow("OpenGL 3.2 test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == NULL) return 3; // Error
//Print errors to console if there are any
printSDLError(__LINE__);
//Set up OpenGL context.
glContext = SDL_GL_CreateContext(window);
printSDLError(__LINE__);
if(glContext == NULL)
{
DEBUGLINE("OpenGL context could not be created.");
system("pause");
return 4;
}
//Initialize glew
GLenum err = glewInit();
if(err != GLEW_OK)
{
DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
system("pause");
return 2;
}
return 0; // OK code, no error.
}
报告的唯一问题是在尝试调用 SDL_GL_CreateContext(window) 之后,SDL 报告“不支持 GL 3.x”。然而,教程和这个 sample pack (我没有费心去测试)报告成功结合了 SDL 1.3 和 OpenGL 3.2。我知道 SDL 1.3 正在开发中,但我有点怀疑是否会删除无意的支持。
仍然创建了一个上下文,并且 GLEW 能够很好地初始化。 (我一辈子都不知道如何查看创建的上下文版本,因为它应该是核心配置文件,而且我也不知道如何找到它。根据教程, SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3) 实际上没有做任何事情,在这种情况下,我不知道如何创建适当的上下文或更改默认上下文。)
编辑:感谢 Nicol 给我的有用功能,经过一些测试后,我发现,无论我传递给 SDL_GL_SetAttribute 的参数如何,上下文始终是 1.1 版。但是,放入 3.0 以下的任何版本都不会吐出一个错误,说明它不受支持。所以问题是 SDL 看到的“核心”版本只有 1.1。
郑重声明,我使用的是 Visual C++ 2010 express、GLEW 1.7.0 和最新的 SDL 1.3 修订版。我对使用所有这三个都是相当陌生的,而且我必须为 32 位和 64 位版本手动构建 SDL 库,所以有很多地方可能出错。然而,到目前为止,32 位和 64 位版本正在做完全相同的事情。
编辑:我使用的是带有最新驱动程序的 nVidia 360M GPU,据 OpenGL Extension Viewer 4.04 报告,它与 OpenGL 3.3 完全兼容。
感谢任何帮助。
更新:我已经设法让 SDL 停止对我大喊它不支持 3.x 上下文。问题是 SDL_GL_SetAttribute 必须设置 BEFORE SDL_Init 被调用:
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
return 1; // Error
}
不幸的是,GLEW 仍然拒绝承认任何高于 OpenGL 1.1 的版本(只有 GLEW_VERSION_1_1 返回 true),这仍然让我感到困惑。 glGetString(GL_VERSION) 也报告 1.1.0。似乎我的程序根本不知道任何更高版本,就好像我根本没有安装它们一样。
最佳答案
因为我不知道你是否已经找到了解决方案,这里是我的:
我今天和昨天都在为这些东西苦苦挣扎。无法使用高级 GL 函数,因此我什至调试了 opengl32.dll 以查看它是否真的有效并将调用包装到特定于硬件的 OpenGL DLL (nvoglnt.dll) 中。所以一定是另有原因。网上什至有提示先链接到 opengl32.lib,然后再链接所有其他库,因为 ChoosePixelFormat 和其他一些函数会被彼此覆盖。
但这也不是原因。我的解决方案是在此处启用加速视觉效果:
// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {
fprintf(stderr, "Could not init SDL");
return 1;
}
// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
因为在当前的 SDL 修订版(2011 年 12 月 15 日)中,他在 SDL_windowsopengl.c 中检查它
if (_this->gl_config.accelerated >= 0) {
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
WGL_NO_ACCELERATION_ARB);
}
如果你没有自己定义,这个属性会被初始化为-1。
并且:切勿在初始化 SDL 之前设置版本属性,因为设置属性需要正确初始化视频后端!
希望对您有所帮助。
关于c++ - 在 SDL 1.3 中创建 OpenGL 3.2/3.x 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110053/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“