我正在使用 C++ 和 Visual Studio 学习 OpenGL,当我运行我的程序时,它会快速提示显示窗口然后崩溃,导致我进入一个断点,上面写着“OpenGL.exe 中 0x00000000 处未处理的异常:0xC000000005:访问违反。”。
这是我的代码:
#include <iostream>
#include <string>
#include <fstream>
#include <sdl2/SDL.h>
#include <gl/glew.h>
GLuint crearShader (const std :: string & texto, GLenum tipo);
std :: string cargarShader (const std :: string & nombreArchivo);
void comprobarErrorShader (GLuint shader, GLuint flag, bool esPrograma, const std :: string & mensaje);
void display ()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Window * ventana = SDL_CreateWindow("OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
640, 480, SDL_WINDOW_OPENGL);
SDL_GLContext contexto = SDL_GL_CreateContext(ventana);
GLenum estado = glewInit();
if (estado != GLEW_OK)
{
std :: cerr << "Fallo al inicializar Glew." << std :: endl;
exit(EXIT_FAILURE);
}
GLuint programa = glCreateProgram(); // <-- Problem goes here.
const unsigned int NUM_SHADERS = 2;
GLuint shaders[ NUM_SHADERS ];
shaders[0] = crearShader(cargarShader("./shaderBasico.vs"), GL_VERTEX_SHADER);
shaders[1] = crearShader(cargarShader("./shaderBasico.fs"), GL_FRAGMENT_SHADER);
unsigned int i;
for (i = 0; i < NUM_SHADERS; i++)
{
glAttachShader(programa, shaders[ i ]);
}
glLinkProgram(programa);
comprobarErrorShader(programa, GL_LINK_STATUS, true, "Error: Fallo al vincular el programa: ");
glValidateProgram(programa);
comprobarErrorShader(programa, GL_VALIDATE_STATUS, true, "Error: El programa es invalido: ");
SDL_Event evento;
do
{
glClearColor(0x00, 0x00, 0x00, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programa);
SDL_GL_SwapWindow(ventana);
SDL_PollEvent(&evento);
}
while (evento.type != SDL_QUIT) ;
for (i = 0; i < NUM_SHADERS; i++)
{
glDetachShader(programa, shaders[ i ]);
glDeleteShader(shaders[ i ]);
}
glDeleteProgram(programa);
SDL_GL_DeleteContext(contexto);
SDL_DestroyWindow(ventana);
SDL_Quit();
}
GLuint crearShader (const std :: string & texto, GLenum tipo)
{
GLuint shader = glCreateShader(tipo);
if (shader == 0)
{
std :: cerr << "Error al crear shader." << std :: endl;
}
const GLchar * shaderSourceStrings[1] = {texto.c_str()};
GLint shaderSourceStringLengths[1] = {texto.length()};
glShaderSource(shader, 1, shaderSourceStrings, shaderSourceStringLengths);
glCompileShader(shader);
comprobarErrorShader(shader, GL_COMPILE_STATUS, true, "Error: Fallo al vincular el programa: ");
return shader;
}
std :: string cargarShader (const std :: string & nombreArchivo)
{
std :: ifstream archivo;
archivo.open(nombreArchivo.c_str());
std :: string salida;
std :: string linea;
if (archivo.is_open())
{
while (archivo.good())
{
getline(archivo, linea);
salida.append(linea + "\n");
}
}
else
{
std :: cerr << "Error, no se pudo cargar un shader." << std :: endl;
}
return salida;
}
void comprobarErrorShader (GLuint shader, GLuint flag, bool esPrograma, const std :: string & mensaje)
{
GLint exito = 0;
GLchar error[1024] = { 0 };
if (esPrograma)
{
glGetProgramiv(shader, flag, &exito);
}
else
{
glGetShaderiv(shader, flag, &exito);
}
if (exito == GL_FALSE)
{
if (esPrograma)
{
glGetProgramInfoLog(shader, sizeof error, NULL, error);
}
else
{
glGetShaderInfoLog(shader, sizeof error, NULL, error);
}
std :: cerr << mensaje << ": '" << error << "'" << std :: endl;
}
}
int main (int argc, char * argv[])
{
display();
return 0;
}
如您所见,我在创建程序之前初始化了 glew,但仍然出现错误,有什么想法吗?
最佳答案
glGetString(GL_VERSION)returns 1.4.0 - Build 8.14.10.2364
好吧,glCreateProgram() 不是 OpenGL 1.4 的核心。
GLEW 最有可能将 glCreateProgram() 设置为 NULL。
Check如果您的 GL 实现支持 ARB_vertex_shader , ARB_fragment_shader , 和 ARB_shader_objects并改用那些 ARB 函数。
如果这些扩展不受支持,那么除非您想使用像Mesa 这样的软件光栅器,否则您在着色器前端就是SOL。 .
关于C++ OpenGL glCreateProgram 在 Windows 上返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187660/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
如何将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.你能做的最好的事情是:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m